2016-11-16 144 views
0

我坚持这个问题:我不能让我的上传工作:上传从DART客户端文件到节点服务器

这是一个Node.js的代码taht与标准<form><input type="file" name="toUpload/>

工作
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); 
    }); 

}); 

现在,当我尝试通过上传镖文件,我卡住,因为发送的数据是不相同的格式:

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"/> 

用这种方法发送的数据的格式为: 请求有效载荷:

数据:text/html的; BASE64,PGh0bWw + DQogICA8aGVhZD4NCiAgICAgIDx0aXRsZT5GaWxlIFVwbG9hZGluZyBGb3JtPC9

我通过了很多时间没有成功,任何人都可以帮助

+0

我试图直接加载数据中的node.js 应用.js: var rawBodySaver = function(req,res,buf,encoding)if(buf && buf.length){ \t req.rawBody = buf.toString(encoding ||'utf8'); } }; and in my upload.js var out = fs.createWriteStream(__ dirname +“/ files/test”); out.write(req.rawBody); 012.ec(); 事情是,我得到的原始数据编码在BAS64前加上信息'data:text/html; base64' –

回答

0

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

+0

是的,我明白,这只是我不能发送数据作为形式 我试图通过上传整个输入来改变它:前端:(变化)= “uploadFiles(上传)” 后端: 空隙uploadFiles(动态上传){ \t \t最终REQ =新的HttpRequest(); \t \t req.open(“POST”,“/ sp/file”); \t \t req.send(upload); –

+0

那么有什么可能:我是新来的飞镖和节点。 (该项目强加这些技术)。我想用dart发送整个多部分表单,但没有任何例子可以显示 (因为我仍然想对js事件做出反应,而且我需要d&d行为,我不能只用一个标准格式) –

+0

如果你知道这个问题,你已经做了**什么**来解决这个问题?查看Dart文档中多部分形式的请求是如何工作的?快速谷歌搜索“multipart form dart”可提供数十种解决方案。 – Matthias247

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> 
+0

解决方案在这里http://stackoverflow.com/questions/26279968/how-can-i-do-a-multipart-post-in-dart-angulardart/40637606#40637606 –

相关问题