发布到服务器的HttpPost参数返回HTTP 500错误

时间:2013-12-09 12:01:23

标签: java curl apache-httpcomponents

我正在尝试将等效的curl'-F'选项发送到指定的网址。

这是使用Curl的命令:

curl -F"optionName=cool" -F"file=@myFile" http://myurl.com

我相信我在Apache httpcomponents库中使用HttpPost类是正确的。

我提供了name = value类型的参数。 optionName只是一个字符串,'file'是我本地存储在我的驱动器上的文件(因此@myFile表示它的本地文件)。

如果我打印响应,我会收到HTTP 500错误...我不确定是什么原因引起了这个问题,因为服务器在使用上面提到的Curl命令时应该响应。在查看下面的代码时,我是否有一些简单的错误?

    HttpPost post = new HttpPost(postUrl);
    HttpClient httpClient = HttpClientBuilder.create().build();

    List<BasicNameValuePair> nvps = new ArrayList<BasicNameValuePair>();
    nvps.add(new BasicNameValuePair(optionName, "cool"));
    nvps.add(new BasicNameValuePair(file, "@myfile"));

    try {
        post.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
        HttpResponse response = httpClient.execute(post);
        // do something with response
    } catch (Exception e) {
        e.printStackTrace();
    } 

1 个答案:

答案 0 :(得分:1)

尝试使用MultipartEntity代替UrlEncodedFormentity来处理参数和文件上传:

MultipartEntity entity = new MultipartEntity();
entity.addPart("optionName", "cool");
entity.addPart("file", new FileBody("/path/to/your/file"));
....

post.setEntity(entity);

修改

MultipartEntity已弃用,FileBody构造函数需要File,而不是String,因此:

MultipartEntityBuilder entity = MultipartEntityBuilder.create();
entity.addTextBody("optionName", "cool");
entity.addPart("file", new FileBody(new File("/path/to/your/file")));
....
post.setEntity(entity.build());

谢谢@CODEBLACK。