在使用 nodejs 實(shí)現(xiàn) ftp 文件上傳的過程中犀变,我發(fā)現(xiàn)文本文件可以正常上傳榨呆,但是圖片文件則不行罗标。圖片被上傳后,文件內(nèi)容被更改了积蜻,無法正常打開了闯割,文件大小也不一致了。
使用的是 jsftp 包竿拆。參考了 ftp-deploy 包宙拉。
嘗試了幾個(gè)可能的問題:
- useList
- 文件系統(tǒng)編碼,有問題的 ftp 的編碼是 GBK丙笋,而 nodejs 默認(rèn)編碼是 utf8
- 上傳模式:ASCII 還是 binary
在嘗試后發(fā)現(xiàn)問題是由上傳模式導(dǎo)致的谢澈,上傳非文本文件時(shí)應(yīng)該是用 binary 模式,即在登錄后鍵入 type I
御板。
使用命令行時(shí)锥忿,登錄后默認(rèn)會(huì)開啟 binary 模式,可能是 ftp 服務(wù)器配置的怠肋,但是通過 jsftp 客戶端登錄時(shí)卻沒有默認(rèn)開啟敬鬓,所以需要手動(dòng)指定一下。
簡單的代碼如下:
import JSFtp from 'jsftp';
const ftp = new JSFtp({
host,
port,
});
ftp.raw(`user ${user}`, (err, {code}) => {
if (err) {
throw err;
}
if (code === 331) {
ftp.raw(`pass ${pass}`, (_err, {code}) => {
if (_err) {
throw _err;
}
if (code === 230) {
ftp.raw('type I', (__err) => {
if (__err) {
throw __err;
}
ftp.put(localFilPath, remoteFilePath, (___err) => {
if (___err) {
throw ___err;
}
ftp.raw('quit', (____err) => {
if (____err) {
throw ____err;
} else {
ftp.destroy();
}
});
})
});
} else {
throw _err;
}
});
} else {
throw err;
}
});