2017-10-20 138 views
1

我最近創建了一個接受文件的API。我正在嘗試使用Postman測試API。如果我使用x-wwww-form-urlencoded身體類型發佈帖子請求,一切正常,我會得到所有預期的數據。唯一的問題是它不允許發送文件。如果我使用form-data正文類型,它允許您發送文件,但我在後端沒有收到任何內容。不知道郵差是否有問題,或者我做錯了什麼。我的直覺是,目前後端不接受form-data,這就是爲什麼我沒有收到任何數據。我能做些什麼來改變它?如何在NodeJS中允許Form-Data

我的頭看起來像這樣,到目前爲止,

res.setHeader('Access-Control-Allow-Origin', origin); 
res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS"); 
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, form-data"); 

app.js

app 
    // static route will go to the client (angular app) 
    .use(express.static('client')) 

    // secured routes 
    .use('/api', secured_route) 

    // add a user route 
    .post('/user', user_api_controller.add_user) 

    // delete this in the production 
    .use(function(req, res, next) { 
     res = allowed_orgins(req, res); 
     next(); 
    }) 
; 

allowed_orgins = function (req, res){ 
    var allowedOrigins = ['http://localhost:4200', 'http://localhost:8100']; 
    var origin = req.headers.origin; 
    if(allowedOrigins.indexOf(origin) > -1){ 
     res.setHeader('Access-Control-Allow-Origin', origin); 
     res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS"); 
     res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, multipart/form-data"); 
    } 
    return res; 
} 

user_api_controller.js

module.exports.add_user = function (req, res) { 
    console.log(req.body.username); 
    console.log(req.body.other_parameters); 
} 

如果我使用form-data,我什麼都不會在控制檯上打印出來,但是當我使用x-wwww-form-urlencoded時它可以正常工作。


我用multer middle ware,我還沒有得到任何東西。當我的後端將收到一些東西時,中間件會發揮作用。我試圖得到form-data的純文本字段,我也沒有得到。這意味着我的後端無法接收所有form-data字段,而不僅僅是文件,而是文本字段。

+0

你需要通過req.body窗體form-data @HafizTemuri – muthukumar

+0

@muthukumar對不起,我沒有抓住。請你爲我詳細說明一下嗎? –

+0

你的問題是不是與標題Kindly通過Muller Middle Ware – muthukumar

回答

0

這裏我超級簡單明示例如:

const express = require('express') 
const fileUpload = require('express-fileupload'); 

const app = express() 
app.use(fileUpload()); 

app.post('/file-upload', function(req, res, next) { 
    console.log(req.body.msg); 
    console.log(req.files); 
    res.send('ok'); 
    next(); 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!') 
}) 

對不起,我不使用郵遞員,但我用curl和它的作品對我來說:

curl http://localhost:3000/file-upload \ 
    -H "Content-Type: multipart/form-data" \ 
    -F "[email protected]/YourDir/YourFile.txt" \ 
    -F "msg=MyFile" 

所以你可以嘗試它,測試它,獲取要點並使用此curl命令與您的應用程序一起玩。

+0

使用你的解決方案,至少我能夠在郵遞員中使用'form-data'時獲得文本字段,這是一個進展,我說。 ,我仍然無法獲得該文件,我嘗試使用curl,它給了我一個錯誤,「Invoke-WebRequest:無法綁定參數'標題',不能轉換」Content-Type:multipart/form-data「值鍵入「System.String」鍵入 「System.Collections.IDictionary」'。任何想法如何解決它? –

+0

無法重現此錯誤...您還使用其他中間件? –

+0

我們需要本地化中間件哪些這個錯誤... –

0

文件上傳的Content-Type頭實際上是multipart/form-data而不是form-data。要在郵差中正確上傳文件,請在此處查看:https://github.com/postmanlabs/postman-app-support/issues/1441#issuecomment-289452571

在後端,您需要一個庫來處理multipart/form-data請求。如果您使用expressjs那麼這個庫將滿足您的需要https://www.npmjs.com/package/multer

下面是如何使用multer

1)首先安裝multer

npm install --save multer 

2)包含庫中的代碼(請注意,上傳目錄必須存在)

var multer = require('multer') 
var upload = multer({ dest: 'uploads/' }) 

3)使用upload作爲中間件您add_user端點(填寫包含上傳的文件與您的字段名的括號)

app 
// other endpoints 
.post('/user', upload.single(/* file field name in your form */), user_api_controller.add_user) 

4)文件可以在您的user_api_controller進行訪問。JS

module.exports.add_user = function (req, res) { 
    console.log(req.file); 
} 
+0

我已將標題類型更改爲'multipart/form-data'。不過,它並沒有顯示我在後端接收數據的任何跡象。我在原始文章中包含了更多的代碼。請檢查我在那裏做錯了什麼。 –

+0

要在後端接收文件,您需要使用另一個庫'multer'。我已經更新了我的答案以提供一些說明。 –

+0

仍然沒有得到任何東西。雖然它創建了上傳文件夾,但它不上傳文件。當我使用'form-data'時,不僅僅是文件,它也不會獲得文本字段。 –