在我的meteor应用程序中,服务器尝试下载一些文件以将它们存储在文件系统上。 我使用Meteor.http包来做到这一点,但事实上,如果下载文件,它们似乎已被破坏。
var fileUrl = 'http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=5'; //for example
Meteor.http.call("GET", fileUrl, function funcStoreFile(error, result) {
"use strict";
if (!error) {
var fstream = Npm.require('fs'),
filename = './.meteor/public/storage/' + collectionId;
fstream.writeFile(filename, result.content, function funcStoreFileWriteFS(err) {
if (!err) {
var Fiber = Npm.require('fibers');
Fiber(function funcStoreImageSaveDb() {
MyfileCollection.update({_id: collectionId}, {$set: {fileFsPath: filename}});
}).run();
} else {
console.log('error during writing file', err);
}
});
} else {
console.log('dl file FAIL');
}
});
我做了一个从公共/存储到../.meteor/public/storage的符号链接,以便从网址(http://localhost:3000/storage/myfileId)直接下载
当我比较使用此系统下载的文件和直接从浏览器下载的同一文件时,它们是不同的。我的观念有什么不对?
答案 0 :(得分:2)
我遇到了类似的问题并根据此讨论提出了解决方案: on https://github.com/meteor/meteor/issues/905
通过使用meteor正在使用的请求库,可以避免二进制下载的问题。此外,我建议不要将小文件保存到文件系统,而是直接在mongodb中编码base64。如果您计划部署到meteor.com或其他云服务,这是最简单的解决方案。 我在开发中将文件保存到公共目录时发现的另一个故障是,meteor正在为公共目录中的每个更改重新加载文件。这可能导致数据损坏,因为正在下载文件的块。这里是我根据上述讨论使用的一些代码。
Future = Npm.require("fibers/future")
request = Npm.require 'request'
Meteor.methods
downloadImage: (url) ->
if url
fut = new Future()
options =
url: url
encoding: null
# Get raw image binaries
request.get options, (error, result, body) ->
if error then return console.error error
base64prefix = "data:" + result.headers["content-type"] + ";base64,"
image = base64prefix + body.toString("base64")
fut.ret image
# pause until binaries are fully loaded
return fut.wait()
else false
Meteor.call 'downloadImage', url, (err, res) ->
if res
Movies.update({_id: id}, {$set: {image: res}})
希望这有用。