当前位置: 首页 > 面试题库 >

如何使用与PHP一起使用的Java HttpClient库上载文件

夹谷苗宣
2023-03-14
问题内容

我想编写Java应用程序,它将使用PHP将文件上传到Apache服务器。Java代码使用Jakarta HttpClient库版本4.0 beta2:

import java.io.File;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.util.EntityUtils;


public class PostFile {
  public static void main(String[] args) throws Exception {
    HttpClient httpclient = new DefaultHttpClient();
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

    HttpPost httppost = new HttpPost("http://localhost:9002/upload.php");
    File file = new File("c:/TRASH/zaba_1.jpg");

    FileEntity reqEntity = new FileEntity(file, "binary/octet-stream");

    httppost.setEntity(reqEntity);
    reqEntity.setContentType("binary/octet-stream");
    System.out.println("executing request " + httppost.getRequestLine());
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity resEntity = response.getEntity();

    System.out.println(response.getStatusLine());
    if (resEntity != null) {
      System.out.println(EntityUtils.toString(resEntity));
    }
    if (resEntity != null) {
      resEntity.consumeContent();
    }

    httpclient.getConnectionManager().shutdown();
  }
}

PHP文件upload.php非常简单:

<?php
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
  echo "File ". $_FILES['userfile']['name'] ." uploaded successfully.\n";
  move_uploaded_file ($_FILES['userfile'] ['tmp_name'], $_FILES['userfile'] ['name']);
} else {
  echo "Possible file upload attack: ";
  echo "filename '". $_FILES['userfile']['tmp_name'] . "'.";
  print_r($_FILES);
}
?>

阅读响应,我得到以下结果:

executing request POST http://localhost:9002/upload.php HTTP/1.1



HTTP / 1.1 200 OK
可能的文件上传攻击:文件名“。
数组
(
)

这样请求就成功了,我可以与服务器通信了,但是PHP没有注意到文件-
is_uploaded_file返回的方法false$_FILES变量为空。我不知道为什么会这样。我已经跟踪了HTTP响应和请求,它们看起来还不错:
请求是:

POST /upload.php HTTP / 1.1
内容长度:13091
内容类型:二进制/八位字节流
主机:localhost:9002
连接:保持活动
用户代理:Apache-HttpClient / 4.0-beta2(java 1.5)
期望:100-继续

˙Ř˙ŕ.....其余的二进制文件...

和回应:

HTTP / 1.1 100继续

HTTP / 1.1 200 OK
日期:2009年7月1日星期三06:51:57 GMT
服务器:Apache / 2.2.8(Win32)DAV / 2 mod_ssl / 2.2.8 OpenSSL / 0.9.8g mod_autoindex_color PHP / 5.2.5 mod_jk / 1.2.26
X-Powered-By:PHP / 5.2.5
内容长度:51
保持活动:超时= 5,最大= 100
连接:保持活动
内容类型:text / html

可能的文件上传攻击:文件名''.Array
(
)

我正在使用xampp的本地Windows XP和远程Linux服务器上对此进行测试。我还尝试使用HttpClient的早期版本-版本3.1-
is_uploaded_file返回的结果更加不清楚false,但是$_FILES数组中填充了正确的数据。


问题答案:

好的,我使用的Java代码是错误的,这里是正确的Java类:

import java.io.File;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.util.EntityUtils;


public class PostFile {
  public static void main(String[] args) throws Exception {
    HttpClient httpclient = new DefaultHttpClient();
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

    HttpPost httppost = new HttpPost("http://localhost:9001/upload.php");
    File file = new File("c:/TRASH/zaba_1.jpg");

    MultipartEntity mpEntity = new MultipartEntity();
    ContentBody cbFile = new FileBody(file, "image/jpeg");
    mpEntity.addPart("userfile", cbFile);


    httppost.setEntity(mpEntity);
    System.out.println("executing request " + httppost.getRequestLine());
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity resEntity = response.getEntity();

    System.out.println(response.getStatusLine());
    if (resEntity != null) {
      System.out.println(EntityUtils.toString(resEntity));
    }
    if (resEntity != null) {
      resEntity.consumeContent();
    }

    httpclient.getConnectionManager().shutdown();
  }
}

注意使用MultipartEntity。



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

  • 问题内容: 我在使用Ajax和php时遇到麻烦。我正在尝试做的是调用ajax函数,该函数从表单的输入中获取值,并检查数据库中是否存在该电子邮件。这是我当前的javascript: 不幸的是,我无法戒备。在我的PHP函数中,它检查输入的是用户名还是电子邮件(仅出于我的目的,所以您知道),然后在任一列中查找它。如果找到它,则返回true,否则返回false: 所以我的问题是,ajax如何响应这些返回值

  • 问题内容: 我收到错误消息“无法加载驱动程序” 问题答案: 尝试这个: 通过删除“;”在php.ini中取消注释以下内容: 使用以下代码连接到PostgreSQL数据库服务器:

  • 问题内容: 我将Ant用作构建工具,并在一开始就将这一行添加到Ant脚本中: 我进一步称呼它: 我收到以下错误消息:BUILD FAILED /home/gouessej/Documents/programmation/java/workspace/tuer/build.xml:445:java.lang.NoClassDefFoundError:org / apache / commons /

  • 问题内容: 我正在尝试让Selenium RC在具有PHP / Apache的Linux上与Firefox 3一起工作,但是遇到了问题。这是我所做的: 我已经安装了Firefox Selenium-IDE扩展。 在Web服务器(在我的情况下,它实际上是运行Firefox的同一台计算机)上,我使用以下命令启动了Selenium服务器:java -jar selenium-server.jar -in

  • 这个问题非常类似于如何使用使用PHPJavaHttpClient库上传文件,但是即使是也不能正确上传文件。这里是客户端的MWE: HELLO WORLD'。 下面是的样子: 输出如下所示,这似乎意味着文件内容被发送到和,而不是 我的猜测是,我在客户端代码中做了一些愚蠢的事情,但我不确定这是什么。