首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用请求、gridfs-stream和multer发布文件

使用请求、gridfs-stream和multer发布文件
EN

Stack Overflow用户
提问于 2019-07-26 17:08:26
回答 1查看 290关注 0票数 1

在我的node.js应用程序中,我需要使用GridFS从GridFS中读取数据,然后通过POST请求将数据上传到另一台服务器,我使用的是模块gridfs-streamrequestmulter

根据 docs,我可以简单地为multipart/form-data添加一个流,所以我正在这样做:

代码语言:javascript
复制
var fileUuid = "myFilename";

var options = {
    url: "url.to/my/target/",
    method: "POST",
    header: {"Content-Type": "multipart/form-data"},
    formData: {
        filedata: gfs.createReadStream({filename: fileUuid})
    }
}

request(options, function(error, response, body) {
    if (error) {
        console.log("[" + getDateTime() + "] Error replicating file:");
        console.log(error);
        return;
    }

    console.log('statusCode: ', response && response.statusCode); 
    console.log('body: ', body);
});

在我的接收服务器上,我有以下代码:

代码语言:javascript
复制
var upload = multer({ dest: './tmp_upload/' })

app.post('/my/target', upload.single('filedata'), function(req, res) {
    console.log('['+getDateTime()+'] Request received');
}

但是,每当我执行请求时,发送服务器上都会出现以下错误:

代码语言:javascript
复制
[2019:07:26:16:52:00] Error replicating file:
Error: write ECONNRESET

在我的接收服务器上:

代码语言:javascript
复制
Error: Unexpected end of multipart data
    at c:\Users\...\node_modules\dicer\lib\Dicer.js:62:28
    at process._tickCallback (internal/process/next_tick.js:61:11)

有人能告诉我如何从一个服务器到另一个服务器POST我的文件吗?

编辑:

问题似乎是gfs.createReadStream({filename: fileUuid})类型的流.当我首先将文件写入文件系统并将fs.createReadStream(...)作为formData放入表单中时,它就能工作了。

但是,是否有一个选项可以直接将流定向到formData,而不必先将其写入磁盘?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-07 14:40:18

因此,我最终使用了从数据库读取的临时文件,将其写入磁盘,并创建一个新的readStream,然后将其放入请求中。请求成功后,我从磁盘中删除临时文件并继续编写代码:

代码语言:javascript
复制
var fsstreamwrite = fs.createWriteStream("./tmp/" + myFile);
var readstream = gfs.createReadStream( {filename: myFile} );
readstream.pipe(fsstreamwrite);
readstream.on("close", function () {
    console.log("File read successfully from database");

    var options = {
        url: "url.to/my/target/",
        method: "POST",
        enctype: "multipart/form-data",
        formData: {
            "filedata": fs.createReadStream('./tmp/' + myFile)
        }
    }

    request(options, function(error, response, body) {
        if (error) {
            // error handling
            return;
        }

        // delete temporary file
        fs.unlinkSync('./tmp/' + myFile)

        // continue with my stuff...

    });                                    

});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57224408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档