【问题标题】:Upload file to Solr with HttpClient and MultipartEntity使用 HttpClient 和 MultipartEntity 将文件上传到 Solr
【发布时间】:2012-06-09 07:27:59
【问题描述】:

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]Problem with setting header "Content-Type" in uploading file with HttpClient4

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

【问题讨论】:

    标签: file-upload solr httpclient multipart


    【解决方案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

    【讨论】:

    • 1) 它是一个字符串,2) 也试过了。这是 Java 和 Apache HttpClient
    • 能否打印正在生成的请求字符串?
    • 您对问题位置的看法完全正确。这是我设置参数的方式。它们应该在 URL 中,而不是设置为 POST 或 Multipart 参数。所以我就这样做了,fileId = URLEncoder.encode(fileId, "UTF-8"); method = new HttpPost(solrUrl + "/update/extract?literal.id="+fileId+"&commit=true");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多