我有一个脚本可以按需构建 zip 文件。使用 Cloud Functions 本地模拟器在本地运行得很好。部署后,它不会传输响应。构建整个 zip 响应,然后发送。我知道发生这种情况是因为正在设置内容长度响应标头,而这在本地没有发生。
如何让 Cloud Functions 传输响应?
exports.zip = (req, res) => {
const zipRequest = {
media: [{
'url': 'https://storage.googleapis.com/...',
'file': 'file1.jpg'
}, {
'url': 'https://storage.googleapis.com/...',
'file': 'file2.jpg'
}, {
'url': 'https://storage.googleapis.com/...',
'file': 'file3.jpg'
}],
filename: 'photos.zip'
};
res.attachment(zipRequest.filename);
res.setHeader('Content-Type', 'application/zip');
let zip = Archiver('zip');
zip.on('end', () => {
res.end();
});
zip.pipe(res);
zipRequest.media.forEach((file) => {
zip.append(request.get(file.url), { name: file.name });
});
zip.finalize();
};
Run Code Online (Sandbox Code Playgroud) 我读了很多这样的问题,但我真的无法弄清楚......
我使用存档器并表达Node.js 模块。我只想向客户端发送一个 zip 文件。我的代码大致如下:
res.set("Content-Type", "application/zip");
archive = archiver("zip", {store: true});
archive.pipe(res);
Run Code Online (Sandbox Code Playgroud)
当请求时,zip 文件被正确传输,但 Chrome 抱怨:
资源被解释为文档但使用 MIME 类型应用程序/zip 传输
如果我做了一些愚蠢的事情,比如将内容类型设置为text/json,我会得到:
资源被解释为 Document 但使用 MIME 类型 text/json 传输
很明显,我在 Node.js 中设置的内容正在完成它的工作,而其他问题就是问题所在。它说资源是用 MIME 类型 applicatioin/zip 传输的,但被解释为 Document。
我如何使它不被解释为文档?
另外,我尝试了这些设置内容类型的方法:
res.type("application/zip");
res.contentType("application/zip");
Run Code Online (Sandbox Code Playgroud)
但我得到了同样的结果。
另一方面,Mozilla 没有抱怨任何事情。类似问题的一些答案说这个警告可以忽略。我也应该忽略它吗?问题可能是存档直接传送到响应对象吗?尽管(我再说一遍),zip 已成功发送。
设置Content-Disposition也不起作用:
res.set({
"Content-Type": "application/zip",
"Content-Disposition": "attachment; filename='images.zip'"
});
Run Code Online (Sandbox Code Playgroud)
我也使用 an<iframe>来发起请求:
document.getElementById("iframe-downloader").src = requestUrl;
Run Code Online (Sandbox Code Playgroud)
原因是因为我不希望页面重定向。我能做到的唯一方法就是这样。
更改此答案指出的Chrome …
我是Node的初学者,我试图弄清楚如何在服务器上创建一个zip文件,然后将其发送到客户端,然后将该zip文件下载到用户的浏览器。我正在使用Express框架,并且正在使用Archiver进行压缩。以下是我的服务器代码,摘自动态创建并将zip流传输到客户端
router.get('/image-dl', function (req,res){
res.writeHead(200, {
'Content-Type': 'application/zip',
'Content-disposition': 'attachment; filename=myFile.zip'
});
var zip = archiver('zip');
// Send the file to the page output.
zip.pipe(res);
// Create zip with some files. Two dynamic, one static. Put #2 in a sub folder.
zip.append('Some text to go in file 1.', { name: '1.txt' })
.append('Some text to go in file 2. I go in a folder!', { name: 'somefolder/2.txt' })
.finalize();
});
Run Code Online (Sandbox Code Playgroud)
因此,它压缩两个文本文件并返回结果。在客户端,我在服务中使用以下函数来实际调用该端点
downloadZip(){
const headers = new Headers({'Content-Type': 'application/json'});
const …Run Code Online (Sandbox Code Playgroud) 当你知道它们的路径时,是否可以存档多个目录?让我们说:['/dir1','dir2', .., 'dirX'].我现在正在做的是将目录复制到一个目录中,让我们说:/dirToZip并执行以下操作:
var archive = archiver.create('zip', {});
archive.on('error', function(err){
throw err;
});
archive.directory('/dirToZip','').finalize();
Run Code Online (Sandbox Code Playgroud)
是否有方法将目录附加到存档中而不是批量需要的特定模式?提前致谢!