首页 > 解决方案 > 如何使用 Node 读取 PUT 文件?

问题描述

我正在尝试复制 bashupload.com 的功能,但使用节点。我想要做的简单,curl host -T file但我遇到了一些问题,因为我似乎无法理解如何读取 PUT 文件。使用选项时,Curl 使用 PUT 请求-T,因此它必须是 PUT。

我尝试使用以下软件包multiparty

receiveAndUploadFile: function (req, res) {
        var multiparty = require('multiparty');
        var form = new multiparty.Form();
        // var fs = require('fs');
        
        form.parse(req, function(err, fields, files) {  
            console.log('The files', files)
            console.log('The fields', fields)
        })
      
        res.send("Okay, bye.")
    }

但这会打印文件和字段的未定义值。

我也尝试过使用express-fileupload中间件

app.use(fileUpload({}));

但是,如果我尝试打印,req.files那么我会变得不确定。

是否有任何特定的方式来读取文件?非常感谢!


这是我的主文件 index.js::

const express = require("express");
const path = require("path");
const app = express();
const port = 8080;
const tools = require("./tools");
const fileUpload = require("express-fileupload");

app.use(fileUpload());
app.use(express.static(__dirname + "/assets"));

app.get("/", (req, res) => {
  res.sendFile(path.join(__dirname + "/index.html"));
});

app.get("/f", (req, res) => {
  res.send("This route is only available as a POST route.");
});
app.put("/f", tools.receiveAndUploadFile);

app.listen(port, () => {
  console.log(`Server started listening on port: ${port}`);
});


还有 tools.js 文件:

const fs = require("fs");
const path = require("path");

module.exports = {
  receiveAndUploadFile: function (req, res) {
    console.log("Files: ", req.files);
    res.send("Okay bye");
  },
};

这是将“文件:未定义”打印到控制台。

标签: node.jscurluploadput

解决方案


PUT 和 POST 实际上是同一件事。要上传任意数据,只需读取数据流并将其写入文件即可。Node 在流上提供了一个 .pipe 方法,可以轻松地将数据从一个流传输到另一个流,例如这里的文件流:

const fs = require('fs')
const express = require('express')

const app = express()
const PORT = 8080

app.get('/*', (req, res) => res.status(401).send(req.url + ': This route is only available as a POST route'))

app.put('/*', function (req, res, next) {
  console.log('Now uploading', req.url, ': ', req.get('content-length'), 'bytes')
  req.pipe(fs.createWriteStream(__dirname + req.url))
  req.on('end', function () { // Done reading!
    res.sendStatus(200)
    console.log('Uploaded!')
    next()
  })
})
app.listen(8080, () => console.log('Started on :8080'))

如果您对 /file.mp4 执行 PUT,它会将所有数据上传到脚本目录 (__dirname) + URL 文件路径。

通过卷曲,curl http://localhost:8080/ -T hello.txt


推荐阅读