当前位置: 首页 > 知识库问答 >
问题:

使用apache的httpclient库上载文件不起作用

孟智志
2023-03-14

这个问题非常类似于如何使用使用PHPJavaHttpClient库上传文件,但是即使是MultipartEntity也不能正确上传文件。这里是客户端的MWE:

import java.io.*;
import java.util.*;

import org.apache.http.entity.mime.*;
import org.apache.http.client.*;
import org.apache.http.message.*;
import org.apache.http.*;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.*;
import org.apache.http.impl.client.*;
import org.apache.http.entity.mime.content.*;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.util.EntityUtils;



// Emulate the post behavior of curl in java except post a string.
// https://stackoverflow.com/questions/4205980/java-sending-http-parameters-via-post-method-easily

public class Foo{

    static String convertStreamToString(java.io.InputStream is) {
        java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
        return s.hasNext() ? s.next() : "";
    }
    // TODO: Fix and test this method.
    private static void PostData() throws Exception {
        String url = "http://localhost/index.php";
        DefaultHttpClient httpclient = new DefaultHttpClient();

        // create the post request.
        HttpPost httppost = new HttpPost(url);
        MultipartEntity entity = new MultipartEntity();

        ContentBody body = new FileBody(new File("/tmp/HelloWorld"),
                org.apache.http.entity.ContentType.APPLICATION_OCTET_STREAM);
        entity.addPart("file", body);
        httppost.setEntity(entity);

        // execute request
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity resEntity = response.getEntity();
        InputStream stream = resEntity.getContent();

        System.out.println(response.getStatusLine());
        System.out.println(convertStreamToString(stream));

    }
    public static void main(String[] args) throws Exception {
        PostData();
    }
}

/tmp/HelloWorld'的内容是HELLO WORLD'。

下面是index.php的样子:

<?php
echo empty($_FILES); 
print_r($_REQUEST); 
print_r($_POST); 
print_r($_GET); 
print_r($_FILES); 
>?

输出如下所示,这似乎意味着文件内容被发送到$\u请求$\u发布,而不是$\u文件

1
Array
(
    [file] => HELLO WORLD

)
Array
(
    [file] => HELLO WORLD

)
Array
(
)
Array
(
)

我的猜测是,我在客户端代码中做了一些愚蠢的事情,但我不确定这是什么。

共有1个答案

陈正业
2023-03-14

我深入研究了PHP源代码,显然Content-Displace行上需要一个filename。因此,在客户机中添加以下代码,从这个答案中解决了这个问题。

    FormBodyPart customBodyPart = new FormBodyPart("file", body) {
            @Override
            protected void generateContentDisp(final ContentBody body) {
                StringBuilder buffer = new StringBuilder();
                buffer.append("form-data; name=\"");
                buffer.append(getName());
                buffer.append("\"");
                buffer.append("; filename=\"-\"");
                addField(MIME.CONTENT_DISPOSITION, buffer.toString());
            }
    };
    entity.addPart(customBodyPart);
 类似资料:
  • 我有一个HTML表单,里面有一个文件上传。我正试图使用通过表单上传Word文档,但它不起作用。 表单有几个文本输入和2个文件上传行。如果我使用方法并将这些字段设置为空Strings,则文本字段将正确提交。因为我需要上传文件,所以我改成了,甚至不能让基本的测试再次工作。 工作守则 正在尝试MultipartEntityBuilder 该表单由Oracle托管并返回错误: 发生意外错误:ORA-065

  • 问题内容: 我想编写Java应用程序,它将使用PHP将文件上传到Apache服务器。Java代码使用Jakarta HttpClient库版本4.0 beta2: PHP文件非常简单: 阅读响应,我得到以下结果: 这样请求就成功了,我可以与服务器通信了,但是PHP没有注意到文件- 返回的方法和变量为空。我不知道为什么会这样。我已经跟踪了HTTP响应和请求,它们看起来还不错: 请求是: 和回应: 我

  • 我有同样的问题输入流。你能分享更多关于你的修复的细节吗? 谢谢,哈莎 链接到您的问题 JavaApache HttpClient上传文件出错

  • 我想使用HttpClient4.3.1上传一个文件。我需要添加一个inputstream来控制上传进度。)而不是文件对象。这是我的代码: 使用MultiPartEntityBuilder.addBinaryBody(Strin,File)方法可以工作,但使用MultiPartEntityBuilder.addBinaryBody(Strin,InputStream)方法则不起作用。 为什么new

  • 我正在测试系统上使用外部REST API。我正在尝试实现一个上载路径,我正在使用Apache HTTPClient。我尝试了以下邮差配置,效果非常好: 上传工作正常。 我总是从rest api中得到一个特定错误: 上载路径的文档中提到了以下详细信息: 标题内容类型多部分/表单数据 我想我在我的请求中完成了这个列表中的每一点——那么邮递员请求和我自己的java http请求之间的区别是什么呢? 我错

  • 问题内容: 我想编写Java应用程序,它将使用PHP将文件上传到Apache服务器。Java代码使用Jakarta HttpClient库版本4.0 beta2: PHP文件非常简单: 阅读响应,我得到以下结果: 这样请求就成功了,我可以与服务器通信了,但是PHP没有注意到文件- is_uploaded_file返回的方法false和$_FILES变量为空。我不知道为什么会这样。我已经跟踪了HTT