【问题标题】:Uploading a blob with nodejs使用 nodejs 上传 blob
【发布时间】:2019-01-20 08:19:17
【问题描述】:

在 nodejs 的帮助下,我正在努力将我的 pdf 文件上传到我的服务器。

我的代码:

app.post("/sendFile", function(req, res) {
   var stream = fs.createWriteStream(path.join(__dirname, 'public', req.body.name + ".pdf"));
    stream.once('open', function () {
       stream.write(req.body.file);
       stream.end();
   });
});

但是,正在上传的文件是Blob。 Nodejs 文档说 .write 函数接受 <string> | <Buffer> | <Uint8Array> 作为第一个参数。它也接受Blob 吗?如果没有,我应该使用哪个其他函数将Blob 正确上传到我的服务器?

谢谢。

编辑:或者我应该将Blob 更改为其他内容?

【问题讨论】:

  • @JC97 我不想将我的Blob 编码为base64。这将是一个矫枉过正(数百位需要存储在某个地方)
  • 您可能正在使用express。如果是,您是否使用multer 处理上传?
  • @JasonCust 我编辑了我的帖子,这就是我所拥有的一切。我应该包括multer 吗?对我有帮助吗?

标签: javascript node.js fs


【解决方案1】:

使用 Express 的 multer 模块很容易做到这一点。 我们还将在目录中添加一个测试 .html 文件(客户端 JavaScript)。

要对此进行测试,请运行 node server.js,然后在浏览器中导航到 http://localhost:8081

server.js

const express = require('express');
const multer = require('multer');
const upload = multer();
const fs = require('fs');

var app = express();
app.use(express.static(__dirname));

app.post('/post_pdf/', upload.any(), (req, res) => {
    console.log('POST /post_pdf/');
    console.log('Files: ', req.files);
    fs.writeFile(req.files[0].originalname, req.files[0].buffer, (err) => {
        if (err) {
            console.log('Error: ', err);
            res.status(500).send('An error occurred: ' + err.message);
        } else {
            res.status(200).send('ok');
        }
    });
});

app.listen(process.env.PORT || 8081);

index.html

<html>
<head>
      <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
      <script>

            var fileData = null;

            function loadFile() {
                var preview = document.querySelector('file');
                var file    = document.querySelector('input[type=file]').files[0];
                var reader  = new FileReader();

                reader.onloadend = function () {
                    fileData = file;
                }
                if (file) {
                    reader.readAsDataURL(file);
                }
            }

            function uploadFile() {
                data = new FormData();
                data.append('file', fileData);

                $.ajax({
                  url: "/post_pdf/",
                  type: "POST",
                  data: data,
                  enctype: 'multipart/form-data',
                  processData: false,
                  contentType: false,
                  success: function(data) {
                      document.getElementById("result").innerHTML = 'Result: Upload successful';
                  },
                  error: function(e) {
                      document.getElementById("result").innerHTML = 'Result: Error occurred: ' + e.message;
                  }
                });
            }

      </script>
</head>
<body>
<input type="file" onchange="loadFile()"><br>
<button onclick="uploadFile()">Upload..</button>
<div id='result'></div>
</body>
</html>

【讨论】:

  • 所以我真的不需要流?我听说它是​​使用流上传文件的更好选择。还是不行?
  • 我猜几mb的文件应该可以缓冲和发送,如果它们可能是几十兆,使用流可能会更好。我建议你测试两者,看看每个的性能是什么。代码非常相似。
  • @Patrickkx 如示例中所示同步写入文件有点令人担忧,因为这似乎是一项 Web 服务。因为 JavaScript 是单线程的,所以同步使用 I/O 事件(在这种情况下写入文件)将阻止该进程能够处理任何其他并发请求。如果您只运行此服务的一个实例来处理您的所有请求,这意味着在文件上传之前不会处理任何其他请求。如果您的流量相对较低,这可能不是问题,但您应该注意这一点。
  • 好点@Jason,我们可以很容易地使用异步写入,尽管正如你所说,这取决于预期的请求量。
  • 哦,客户端,你应该不需要更改服务器端代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2013-08-17
  • 2020-02-29
  • 1970-01-01
  • 2022-01-17
  • 2019-03-10
相关资源
最近更新 更多