Corrupt/truncated 使用 NodeJS 和 AWS S3 将 mp4 上传到 S3 存储桶
Corrupt/truncated mp4 upload to S3 bucket using NodeJS and AWS S3
我正在使用 fs.readFile 读取一个大约 700KB 的本地 mp4 文件,并使用 AWS SDK 将文件加载到我的 S3 存储桶中。该过程有效,但文件已损坏,可能被截断了,因为 S3 上生成的文件大小仅为 500KB 左右。
我使用的代码适用于图像。只是不适用于 mp4 文件。这是我的代码:
fs.readFile(file_location, function (err, data) {
if (err) {
console.log('fs error': err);
} else {
var base64data = new Buffer(data, 'binary');
var params = {
Bucket: config.settings.bucket,
Key: 'file.mp4',
Body: base64data,
ContentEncoding: 'base64',
ContentType: 'video/mp4'
};
s3.putObject(params, function(err, data) {
if (err) {
console.log('Error putting object on S3: ', err);
} else {
console.log('Placed object on S3: ', object_key);
}
});
}
});
我尝试从参数对象中省略 ContentEncoding and/or ContentType 属性。
编辑:
因此,当我对 fs.readFile 返回的数据长度进行 console.log 计算时,它总是很短。我也没有意识到我实际上也没有在处理 base64 数据。因此,如果我在要求使用 base64 读取文件的地方使用以下代码,fs.readFile 中的 data.length 似乎是正确的,并且 mp4 文件显示在我的 S3 存储桶中,播放头位于浏览器(我之前没有得到),但视频无法播放并且是黑色的,所以它似乎仍然损坏。
fs.readFile(file_location, 'base64', function (err, data) {
if (err) {
console.log('fs error': err);
} else {
var params = {
Bucket: config.settings.bucket,
Key: 'file.mp4',
Body: data,
ContentEncoding: 'base64',
ContentType: 'video/mp4'
};
s3.putObject(params, function(err, data) {
if (err) {
console.log('Error putting object on S3: ', err);
} else {
console.log('Placed object on S3: ', object_key);
}
});
}
});
您从 readFile
返回的 data
变量已经可以使用了。只需使用 Body: data
直接传递即可。完全删除 ContentEncoding
参数,因为您不发送 base64 数据。
我正在使用 fs.readFile 读取一个大约 700KB 的本地 mp4 文件,并使用 AWS SDK 将文件加载到我的 S3 存储桶中。该过程有效,但文件已损坏,可能被截断了,因为 S3 上生成的文件大小仅为 500KB 左右。
我使用的代码适用于图像。只是不适用于 mp4 文件。这是我的代码:
fs.readFile(file_location, function (err, data) {
if (err) {
console.log('fs error': err);
} else {
var base64data = new Buffer(data, 'binary');
var params = {
Bucket: config.settings.bucket,
Key: 'file.mp4',
Body: base64data,
ContentEncoding: 'base64',
ContentType: 'video/mp4'
};
s3.putObject(params, function(err, data) {
if (err) {
console.log('Error putting object on S3: ', err);
} else {
console.log('Placed object on S3: ', object_key);
}
});
}
});
我尝试从参数对象中省略 ContentEncoding and/or ContentType 属性。
编辑:
因此,当我对 fs.readFile 返回的数据长度进行 console.log 计算时,它总是很短。我也没有意识到我实际上也没有在处理 base64 数据。因此,如果我在要求使用 base64 读取文件的地方使用以下代码,fs.readFile 中的 data.length 似乎是正确的,并且 mp4 文件显示在我的 S3 存储桶中,播放头位于浏览器(我之前没有得到),但视频无法播放并且是黑色的,所以它似乎仍然损坏。
fs.readFile(file_location, 'base64', function (err, data) {
if (err) {
console.log('fs error': err);
} else {
var params = {
Bucket: config.settings.bucket,
Key: 'file.mp4',
Body: data,
ContentEncoding: 'base64',
ContentType: 'video/mp4'
};
s3.putObject(params, function(err, data) {
if (err) {
console.log('Error putting object on S3: ', err);
} else {
console.log('Placed object on S3: ', object_key);
}
});
}
});
您从 readFile
返回的 data
变量已经可以使用了。只需使用 Body: data
直接传递即可。完全删除 ContentEncoding
参数,因为您不发送 base64 数据。