Я пытаюсь загрузить аудиофайл (mp3) с AWS S3 на локальный компьютер. Он отлично работает, когда я выполняю на локальном хосте, но после развертывания того же кода на AWS. Он загружает файлы на серверную машину, а не на локальную машину пользователя.
Пробовал эти две версии. Оба делают одинаково
const key = track.audio_transcode_filename.substring(20);
var s3Client = knox.createClient(envConfig.S3_BUCKET_TRACKS);
const os = require('os');
const downloadPath = os.homedir().toString();
const config =require('../../config/environment');
const fs = require('fs');
var filePath=downloadPath + "\\Downloads\\" + track.formatted_title + ".mp3";
if (fs.existsSync(filePath)) {
var date = new Date();
var timestamp = date.getTime();
filePath=downloadPath + "\\Downloads\\" + track.formatted_title + "_" + timestamp + ".mp3";
}
const file = fs.createWriteStream(filePath);
s3Client.getFile(key, function(err, res) {
res.on('data', function(data) { file.write(data); });
res.on('end', function(chunk) { file.end(); });
});
var audioStream = '';
s3Client.getFile(key, function(err, res) {
res.on('data', function(chunk) { audioStream += chunk });
res.on('end', function() { fs.writeFile(filePath + track.formatted_title + ".mp3", audioStream, 'binary')})
});
Спасибо, Кант





Вместо того, чтобы получать файл и снова отправлять клиенту, как насчет получения URL-адреса файла и перенаправления клиента?
Что-то типа:
s3Client.getResourceUrl(key, function(err, resourceUrl) {
res.redirect(resourceUrl);
)};
Вам нужно отправить его пользователю. Итак, я думаю, у вас есть ExpressJS, и пользователь может получить элемент, используя конечную точку вашего API.
После всего, что вы сделали в своем вопросе, вам нужно будет отправить его пользователю.
res.sendFile('/path/to/downloaded/s3/object')
Спасибо обоим @Rashomon и @Martin do Santos. Мне пришлось добавить скрипт на стороне клиента для чтения потока ответов и загрузки файла следующим образом.
downloadTrack(track).then((result) =>{
//var convertedBuffer = new Uint8Array(result.data);
const url = window.URL.createObjectURL(new Blob([result.data],{type: 'audio/mpeg'}));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', track.formatted_title + '.mp3');
document.body.appendChild(link);
link.click();
}, (error) =>{
console.error(error);
})