如何上传文件 – sails.js
我可以下载图片和pdf,但是我无法下载文档文件(.doc .pptx .odt …)
当下载文档(.doc .pptx .odt …)作为.ZIP唯一的XML文件下载时。 我可以做什么?
我正在使用: 填写上传文件的文档
upload: function (req, res) { req .file('avatar') .upload({ maxBytes: 10000000 }, function whenDone(err, uploadedFiles) { if (err) { return res.negotiate(err); } // Generate a unique URL where the avatar can be downloaded. avatarUrl = require('util').format('%s/user/avatar/%s', sails.getBaseUrl(), req.session.User.id_user), // Grab the first file and use it's `fd` (file descriptor) avatarFd = uploadedFiles[0].fd var SkipperDisk = require('skipper-disk'); var fileAdapter = SkipperDisk(/* optional opts */); // Stream the file down fileAdapter.read(avatarFd).on('error', function (err){ return res.serverError(err); }).pipe(res); }); },
我在Windows上使用它,它没有问题。
upload : function (req, res) { req.file('avatar').upload({ maxBytes: 10000000 }, function whenDone(err, uploadedFiles) { if (err) { return res.negotiate(err); } var avatarFd = uploadedFiles[0].fd; res.ok(avatarFd); }); }, download: function (req, res) { var location = req.param('fd'); var SkipperDisk = require('skipper-disk'); var fileAdapter = SkipperDisk(/* optional opts */); fileAdapter.read(location).on('error', function (err) { return res.serverError(err); }).pipe(res); }
首先使用/somecontroller/upload
multipart/form-data
,它会返回一个fd
位置。 并使用此url下载
http://localhost:1337/somecontroller/download?fd=[fd-from-upload-return]
控制器名称和主机名称取决于您的应用程序configuration。
使用fd
完整path只是一个例子,在后面你应该使用你自己的控制器从上传的文件夹到已经上传的返回文件的地址,通常在.tmp/uploads/
。
因此,您正在使用一个名为Skipper的Sails.js生态系统的一部分库。 它有一些文件可能对你有帮助。
它将您的文件保存为上传的随机GUID,直到您select使用它。 我的猜测是,它没有携带“.docx”标签,而.docx文件实际上只是拉链。 (也许这是一个你可以提交的错误?)
我的build议是使用saveAs选项。 您可以指定一个string作为保存位置。 即:
req.file('file_upload').upload({saveAs: Guid.raw()+'.docx'}, handleUploadCompletion);
也有能力传递一个函数,以处理多file upload取决于stream。
我想你在回应中忘记了一些HTTP标题 :
- 内容处置:设置您要发送的文件的名称
- 例如“attachment; filename =”ecd1c7c2-6e32-4110-8905-c003a4713bb0.odt“”
- 内容types:您要发送的内容的MIMEtypes
- 例如“application / vnd.oasis.opendocument.text”
您可以手动设置它们或使用res.attachment
方法:
res.attachment(avatarFd);