2016-11-16 183 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 –

相關問題