通过 FTP 从无服务器 AWS Lambda 发送二进制图像
Send Binary Image from Serverless AWS Lambda Over FTP
我正在构建一个 AWS Lambda API,使用无服务器堆栈,它将接收图像作为二进制字符串,然后将该图像存储在 GitHub 上并通过 FTP 到静态应用程序服务器。我根本没有将图像存储在 S3 中,因为我被要求不要这样做。
我已经弄清楚如何将图像保存到 GitHub(通过将二进制转换为 base64),问题是通过 FTP 将二进制图像数据发送到另一台服务器以静态保存。静态图像服务器是预先存在的,我不能使用 S3。我正在使用 ftp npm package to send the image. The image server indeed receives the image BUT NOT in the correct format and the image is just non-displayable junk data. I saw an example 来了解如何通过在 Uint16Array 中对图像进行编码并将其传递给新的 Blob() 对象来在客户端执行此操作,但遗憾的是,NODE.JS 不支持 BLOBS!
使用 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 包吗?或者我只是没有正确编码??我花了几天时间在 google 上搜索这个看似常见的任务的答案,这让我感到困惑!谁能指导我如何通过 FTP 将来自 node.js lambda 函数的二进制图像数据发送到另一台服务器,以便图像被正确编码并在查看时工作?非常感谢任何帮助!
所以,事实证明我使用的 ftp 节点模块一直是问题所在。它会破坏通过 FTP 传输的任何二进制图像。我向他们的 GitHub 回购提交了一张票,但他们已经 4 年没有提交了,所以我不希望及时修复。
为了解决这个问题,我改用了Basic 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;
}
}
请注意,此包需要通过可读流传输数据。感谢 this SO answer,我学会了如何将二进制字符串转换为可读流。一切正常。
编码愉快!
我正在构建一个 AWS Lambda API,使用无服务器堆栈,它将接收图像作为二进制字符串,然后将该图像存储在 GitHub 上并通过 FTP 到静态应用程序服务器。我根本没有将图像存储在 S3 中,因为我被要求不要这样做。
我已经弄清楚如何将图像保存到 GitHub(通过将二进制转换为 base64),问题是通过 FTP 将二进制图像数据发送到另一台服务器以静态保存。静态图像服务器是预先存在的,我不能使用 S3。我正在使用 ftp npm package to send the image. The image server indeed receives the image BUT NOT in the correct format and the image is just non-displayable junk data. I saw an example 来了解如何通过在 Uint16Array 中对图像进行编码并将其传递给新的 Blob() 对象来在客户端执行此操作,但遗憾的是,NODE.JS 不支持 BLOBS!
使用 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 包吗?或者我只是没有正确编码??我花了几天时间在 google 上搜索这个看似常见的任务的答案,这让我感到困惑!谁能指导我如何通过 FTP 将来自 node.js lambda 函数的二进制图像数据发送到另一台服务器,以便图像被正确编码并在查看时工作?非常感谢任何帮助!
所以,事实证明我使用的 ftp 节点模块一直是问题所在。它会破坏通过 FTP 传输的任何二进制图像。我向他们的 GitHub 回购提交了一张票,但他们已经 4 年没有提交了,所以我不希望及时修复。
为了解决这个问题,我改用了Basic 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;
}
}
请注意,此包需要通过可读流传输数据。感谢 this SO answer,我学会了如何将二进制字符串转换为可读流。一切正常。
编码愉快!