Это то, что я сейчас имею:
express.js
app.get('/downloadZip', function(req, res) {
var file = req.query.downloadURL;
var filename = path.basename(file);
var mimetype = 'application/zip';
res.setHeader('Content-disposition', 'attachment');
res.setHeader('Content-type', mimetype);
var filestream = fs.createReadStream(file);
filestream.pipe(res);
});
мой контроллер
$http({
method: "GET",
url: '/downloadZip',
params: {
downloadURL: 'myZip.zip'
},
responseType: 'arraybuffer'
}).then(
function success(data, status, headers, config) {
$log.debug('downloadZip success: ', data);
var blob = new Blob([data], {type: 'application/octet-stream'});
// using FileSaver.js
saveAs(blob, 'newZipName.zip');
},
function error(error) {
$log.debug('downloadZip error: ', error);
});
При таком подходе кажется, что файл ok - выход $log.debug
показывает ArrayBuffer размером 5 Мб для data
, что является правильным размером файла. НО, файл всегда загружается как 1Kb и явно не открывается.
Я пытаюсь FileSaver.js в приведенном выше примере, но я также попытался использовать angular.element('<a/>')
и т.д., И это всегда приводит к загрузке 1Kb.
Есть ли что-нибудь, что я могу сделать, чтобы загрузить полный ZIP правильно?
Редактировать:
Я понял это - см. Ответ ниже. Одна из этих глупых ошибок. Но, по крайней мере, есть какой-то хороший бесплатный код выше для тех, кто хочет скачать ZIP файлы;)
Все, что мне было нужно, это data.data
.
Поскольку это было содержимое полученного объекта data
:
Object {data: ArrayBuffer, status: 200, config: Object, statusText: "OK"}
Поэтому мне пришлось указать дочерние data
, содержащие ArrayBuffer...
var blob = new Blob([data.data], {type: 'application/octet-stream'});
/downloadZip?downloadURL=package.json