【问题标题】:Unsupported media type when uploading form data to spring server将表单数据上传到spring服务器时不支持的媒体类型
【发布时间】:2017-05-13 10:30:32
【问题描述】:

我正在尝试通过 API 将文件上传到远程 Spring 服务器,即使我已经将数据转换为表单数据,我仍然不断收到不支持的媒体类型错误 (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 Spring 控制器供参考:

    @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";
    }
}

这是表单数据控制台日志:

还有 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"
}

--更新--

好吧,我在阅读request的文档后才发现,如果你使用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

【问题讨论】:

    标签: node.js spring http express multipartform-data


    【解决方案1】:

    您似乎正在发送带有Content-Type: 'application/x-www-form-urlencoded' 的POST 请求,而您的SpringController insertDeliveryAttachment() 使用multipart/form-data mime-type。

    我建议您将 insertDeliveryAttachment() 方法上的消耗 mime 类型更改为 MediaType.APPLICATION_FORM_URLENCODED_VALUE

    【讨论】:

    • 您好,感谢您的回复。例如,如果我无法更改 insertDeliveryAttachment() 方法怎么办?是否可以在快递请求中提供解决方法?
    • 是的,那么您必须使用multipart/form-data 发送您的请求。您可以使用Multer 来实现此目的。有关application/x-www-form-urlencodedmultipart/form-data 的详细信息,请查看此link
    • 刚刚看了下,好像已经在发multipart/form-data了。但是由于某种原因,服务器认为我正在发送application/x-www-form-urlencoded
    【解决方案2】:

    我已经解决了。我没有使用 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){ ... });
    

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 2018-10-29
      • 1970-01-01
      • 2014-05-25
      • 2017-09-22
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2013-01-13
      相关资源
      最近更新 更多