1

httpclient, httpmime 4.1.3

我正在尝试通过 http 将文件上传到远程服务器,但没有成功。

这是我的代码:

    HttpPost method;
    method = new HttpPost(solrUrl + "/extract");
    method.getParams().setParameter("literal.id", fileId);
    method.getParams().setBooleanParameter("commit", true);

    MultipartEntity me = new MultipartEntity();
    me.addPart("myfile", new InputStreamBody(doubleInput, contentType, fileId));

    method.setEntity(me);
    //method.setHeader("Content-Type", "multipart/form-data");
    HttpClient httpClient = new DefaultHttpClient();
    HttpResponse hr = httpClient.execute(method);

服务器是 Solr。

curl这是为了替换一个像这样调用的工作 bash 脚本,

curl http://localhost:8080/solr/update/extract?literal.id=bububu&commit=true -F myfile=@bububu.doc

如果我尝试设置“Content-Type”“multipart/form-data”,接收部分会说没有边界(这是真的):

HTTP Status 500 - the request was rejected because no multipart boundary was found

如果我忽略此标头设置,服务器会发出一个错误描述,据我所知,该描述表明内容类型不是多部分 [2]:

HTTP Status 400. The request sent by the client was syntactically incorrect ([doc=null] missing required field: id).

这与 [1] 有关,但我无法从中确定答案。我在想,

我处于同样的情况,但不知道该怎么做。我希望 MultipartEntity 会告诉 HttpPost 对象它是多部分的、表单数据并且有一些边界,并且我不会自己设置内容类型。我不太明白如何为实体提供边界——MultipartEntity 没有像 setBoundary 这样的方法。或者,如何让我自己在 addHeader 中指定随机生成的边界 - 也没有 getBoundary 方法......

[1]使用 HttpClient4 上传文件时设置标题“Content-Type”的问题

[2] http://lucene.472066.n3.nabble.com/Updating-the-index-with-a-csv-file-td490013.html

4

1 回答 1

1

我怀疑

method.getParams().setParameter("literal.id", fileId);
method.getParams().setBooleanParameter("commit", true);

在第一行,是fileId字符串还是文件指针(或其他)?我希望它是一个字符串。至于第二行,您可以设置一个普通参数。


我正在努力解决HTTP Status 400. 我不太了解Java(或者是.Net?)

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error

于 2012-06-11T07:28:05.640 回答