2017-05-13 27 views
0

我試圖通過API將文件上傳到遠程彈簧服務器,並且即使我已經將數據轉換爲數據,我也不斷收到不受支持的媒體類型錯誤(415)形成數據。將表單數據上傳到彈簧服務器時不受支持的媒體類型

這裏是明確HTTP POST請求:

var FormData = require('form-data'); 
var fs = require('fs'); 
var form = new FormData(); 

form.append('pid', params.pid); 
form.append('deliveryAttachment', fs.createReadStream(params.deliveryAttachment.path)); 

var url = someDomain + '/proj/new/deliveryAttachment'; 
requestLib({ 
    url: url, 
    method: "POST", 
    jar: getJar(), 
    form: form 
},function (error, response, body){  
    console.log(body) 
}); 

這裏參考了Java春控制器:

@RequestMapping(value = "proj/new/deliveryAttachment", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.TEXT_PLAIN_VALUE) 
public String insertDeliveryAttachment(@RequestParam("pid") long pid, 
     @RequestParam("deliveryAttachment") MultipartFile file) { 
    try { 
     DeliveryAttachment a = new DeliveryAttachment(file.getOriginalFilename(), pid); 
     ps.insertDeliveryAttachment(a, file.getBytes()); 
     return String.valueOf(a.id); 
    } catch (IOException e) { 
     return "-1"; 
    } 
} 

這是形式的數據控制檯日誌:

enter image description here

和415響應:

{ 
    "timestamp": 1494671395688, 
    "status": 415, 
    "error": "Unsupported Media Type", 
    "exception": "org.springframework.web.HttpMediaTypeNotSupportedException", 
    "message": "Content type 'application/x-www-form-urlencoded' not supported", 
    "path": "/proj/new/deliveryAttachment" 
} 

--UPDATE--

好吧,我剛剛找到了讀出請求的文檔,如果你使用form作爲數據的持有人,將數據視爲application/x-www-form-urlencoded

例如; request.post({url:'http://service.com/upload', form: {key:'value'}}, function(err,httpResponse,body){ ... });

同時爲multipart/form-data正確的關鍵是formData

例如; request.post({url:'http://service.com/upload', formData: formData}, function optionalCallback(err, httpResponse, body) { ... });

我試了一下,現在它給了我一個新的錯誤:

TypeError: Cannot read property 'name' of null at FormData._getContentDisposition

回答

0

似乎正在發送POST請求與Content-Type: 'application/x-www-form-urlencoded',你的SpringController insertDeliveryAttachment()消耗multipart/form-data MIME類型。

我會建議你在你的insertDeliveryAttachment()方法改變所消耗的MIME類型MediaType.APPLICATION_FORM_URLENCODED_VALUE

+0

嗨,謝謝你的回覆。例如,如果我沒有辦法改變'insertDeliveryAttachment()'方法?是否有可能在請求中有明確的解決方法? – Growlithe

+0

是的,那麼你必須用'multipart/form-data'發送你的請求。你可以使用[Multer](https://github.com/expressjs/multer)來實現這一點。 請查看此[鏈接](http://derpturkey.com/node-multipart-form-data-explained/)瞭解有關'application/x-www-form-urlencoded'和'multipart/form-data '。 – ansh

+0

好的,謝謝我會檢查出來 – Growlithe

0

我已經解決了它。我沒有使用FormData,只是在一個對象中插入值並且工作。

var data = { 
    pid: params.pid, 
    deliveryAttachment: fs.createReadStream(params.deliveryAttachment[0].path) 
}; 

var url = wfDomain + '/proj/new/deliveryAttachment'; 
requestLib({ 
    url: url, 
    method: "POST", 
    headers: { 
     'Content-Type': 'multipart/form-data' 
    }, 
    jar: getJar(), 
    formData: data 
},function (error, response, body){ ... }); 
相關問題