我正在使用无服务器堆栈构建一个AWS Lambda API,它将以二进制字符串的形式接收图像,然后将该图像存储在GitHub上,并通过FTP将其发送到静态应用程序服务器。 我根本没有将图像存储在 S3 中,因为我不需要这样做。
我已经弄清楚了如何将图像保存到 GitHub(通过将二进制转换为 base64),问题是通过 FTP 将二进制图像数据发送到另一台服务器以静态保存。 静态映像服务器是预先存在的,我无法使用 S3。 我正在使用 ftp npm 包来发送图像。 图像服务器确实接收图像,但格式不正确,图像只是不可显示的垃圾数据。 我看到了一个如何在客户端执行此操作的示例,方法是在 Uint16Array 中对图像进行编码并将其传递给新的 Blob() 对象,但遗憾的是,NODE.JS 不支持 BLOB!
使用 ftp npm 模块:
async sendImage(image) {
try {
const credentials = await getFtpCredentials(this.platform);
console.log('Sending files via FTP client');
return new Promise((resolve, reject) => {
let ftpClient = new ftp();
ftpClient.on('ready', () => {
console.log(`Putting ${image.path} onto server`);
// Set transfer type to binary
ftpClient.binary(err => {
if(err)
reject(err);
});
// image.content is binary string data
ftpClient.put(image.content, image.path, (err) => {
if (err) {
reject(err);
}
console.log('Closing FTP connection');
ftpClient.end();
resolve(`FTP PUT for ${image.path} successful!`);
});
});
console.log('Connecting to FTP server');
ftpClient.connect(credentials);
});
} catch(err) {
console.log('Failed to load image onto FTP server');
throw err;
}
}
此过程将二进制数据发送到服务器,但任何浏览器或图像查看器都无法读取数据。 我是否需要使用其他 FTP 包? 还是我只是没有编码正确?? 我花了几天时间在谷歌上搜索这个看似常见的任务的答案,它让我爬上了墙! 任何人都可以指导我如何通过 FTP 将二进制图像数据从节点.js lambda 函数发送到另一台服务器,以便图像正确编码并在查看时正常工作? 任何帮助都非常感谢!
所以,事实证明,我一直在使用的ftp节点模块一直是问题所在。 它将损坏通过FTP传输的任何二进制映像。 我向他们的 GitHub 存储库提交了一张票证,但他们已经 4 年没有做出承诺了,所以我不希望及时修复。
为了解决这个问题,我改用了基本FTP包:
const ftp = require('basic-ftp');
async sendImage(image) {
try {
const { host, user, password } = await getFtpCredentials(this.platform);
console.log('Received FTP credentials');
console.log('Creating FTP client');
const client = new ftp.Client();
client.ftp.verbose = true;
console.log('Logging in to remote server via FTP');
await client.access({
host, user, password, secure: false
});
console.log('Creating readable stream from binary data');
const buffer = new Buffer(image.content, 'binary');
const imgStream = new Readable();
imgStream._read = () => {};
imgStream.push(buffer);
imgStream.push(null);
console.log('Uploading readable stream to server via FTP');
const result = await client.upload(imgStream, image.path);
client.close();
return result
} catch(err) {
console.log('Failed to load image onto FTP server');
throw err;
}
}
请注意,此包要求通过可读流传输数据。 多亏了这个 SO 答案,我学会了如何将二进制字符串转换为可读流。 一切正常。
祝您编码愉快!