【问题标题】:Upload a file from dart client to Node server将文件从 dart 客户端上传到 Node 服务器
【发布时间】:2016-11-16 13:17:03
【问题描述】:

我遇到了这个问题:我无法让我的上传工作:

这是一个与标准 <form><input type="file" name="toUpload/> 配合使用的 node.js 代码

router.post('/sp/file', function (req, res) {
  // File to be uploaded
  console.log("###" + req.files);
  var fileToUpload = req.files.toUpload;
  //console.log(fileToUpload);
  var dir = __dirname + "/files";
/*  var dir = __dirname + "/files/" + Date.now();
  if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir);
  }*/

  fileToUpload.mv( __dirname + "/files/" + fileToUpload.name, function (err) {
    if (err) {
      console.log("error: " + err);
    } else
      console.log("upload succeeded");
    console.log(fileToUpload);
    console.log(__dirname + "/files/" + fileToUpload.name);
    uploadFilesStorj.uploadFile(__dirname + "/files/" + fileToUpload.name);
  });

});

现在,当我尝试通过 dart 上传文件时,由于发送的数据格式不同,我被卡住了:

class AppComponent {
void uploadFiles(dynamic files) {
    if (files.length == 1) {
        final file = files[0];
        final reader = new FileReader();
        //reader.onProgress.listen()
        reader.onLoad.listen((e) {
            sendData(reader.result);
        });
        reader.readAsDataUrl(file);
    }
}

sendData(dynamic data) async {
    final req = new HttpRequest();
    req.onReadyStateChange.listen((Event e) {
        if (req.readyState == HttpRequest.DONE &&
                (req.status == 200 || req.status == 0)) {}
    });
    req.onProgress.listen((ProgressEvent prog) {
        if (prog.lengthComputable)
            print("advancement : " + (prog.total / prog.loaded).toString());
        else
            print("unable to compute advancement");
    });
    req.open("POST", "/sp/file");
    req.send(data);
}

}

这是我的飞镖角前端代码

<input type="file" #upload (change)="uploadFiles(upload.files)"
                     (dragenter)="upload.style.setProperty('border', '3px solid green')"
                     (drop)="upload.style.setProperty('border', '2px dotted gray')" class="uploadDropZone" name="toUpload"/>

此方法发送的数据格式为: 请求负载:

数据:文本/html;base64,PGh0bWw+DQogICA8aGVhZD4NCiAgICAgIDx0aXRsZT5GaWxlIFVwbG9hZGluZyBGb3JtPC9

我花了很多时间都没有成功,请有人帮忙

【问题讨论】:

  • 我尝试在 node.js app.js 中直接加载数据: var rawBodySaver = function (req, res, buf, encoding) { if (buf && buf.length) { req.rawBody = buf.toString(编码 || 'utf8'); } };在我的 upload.js var out = fs.createWriteStream(__dirname + "/files/test" ); out.write(req.rawBody); out.end();问题是我得到了以 bas64 编码的原始数据,前缀为 info 'data:text/html;base64'

标签: node.js dart angular-dart


【解决方案1】:

我终于找到了一种将它作为多部分表单发布的方法:

void uploadFiles() {
    var formData = new FormData(querySelector("#fileForm"));
    HttpRequest.request("/sp/file", method: "POST", sendData: formData).then((req) {
        print("OK");
    });
}

与

结合使用
<form id="fileForm">
    <input type="file" #upload (change)="uploadFiles(upload.files)"
             (dragenter)="upload.style.setProperty('border', '3px solid green')"
             (drop)="upload.style.setProperty('border', '2px dotted gray')" class="uploadDropZone" name="toUpload"/>
</form>

【讨论】:

【解决方案2】:

您将文件内容直接写入 Dart 变体的请求正文中。然而,HTML 表单使用多部分表单编码发送请求并将文件嵌入其中。这也是您的服务器所期望的。

【讨论】:

  • 是的,我明白,只是我无法以表格形式发送数据我试图通过上传整个输入来更改它:前端:(更改)=“​​上传文件( upload)" 后端:void uploadFiles(动态上传) { final req = new HttpRequest(); req.open("POST", "/sp/file"); req.send(上传);
  • 那么有什么可能:我是飞镖和节点的新手。 (该项目强加了这些技术)。我想用 dart 发送整个 multipart-form,但是没有例子可以展示(因为我仍然想对 js 事件做出反应,而且我需要有 d&d 行为,我不能只使用标准形式)
  • 如果您知道的话,您已经 做了什么 来解决这个问题?查看 Dart 文档中的多部分表单请求是如何工作的?在 Google 上快速搜索“multipart form dart”可提供数十种解决方案。
  • 我也尝试从节点访问 "data" ,做 console.log("###" + req.data);但它回答说它是未定义的......
  • 这个例子展示了如何创建一个表单并发送json数据,但是我需要发送一个输入文件stackoverflow.com/questions/25742113/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
相关资源
最近更新 更多