V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zorui
V2EX  ›  Java

通过 Java httpclient 模拟表单上传 PHP /5.3.3 上 empty($_FILES) 为空,通过 html 代码直接表单提交就是正常的。 PHP /5.4.40 也是可以的

  •  
  •   zorui · 2017-04-01 11:34:04 +08:00 · 3168 次点击
    这是一个创建于 2798 天前的主题,其中的信息可能已经有所发展或是发生改变。

    通过 java httpclient 模拟表单上传 PHP/5.3.3 上 empty($_FILES) 为空,通过 html 代码直接表单提交就是正常的。 PHP/5.4.40 也是可以的

    httpclient4.5.2 模拟请求的代码:

                InputStreamBody streamBody = new InputStreamBody(inputStream, contentType, fileData.getFilename());
    
                MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
                multipartEntityBuilder.addPart("file", streamBody);
    
                for (String key : params.keySet()) {
                    multipartEntityBuilder.addPart(key, new StringBody((String) params.get(key), ContentType.TEXT_PLAIN));
                }
    
                HttpEntity entity = multipartEntityBuilder
                        .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
                        .setContentType(MULTIPART_FORM_DATA_UTF8)
                        .setCharset(Consts.UTF_8).build();
                httpPost.setEntity(entity);
    
                HttpResponse response = HttpClientBuilder.create().build().execute( httpPost);
                String resultStr = IOUtils.toString(response.getEntity().getContent());
    

    php 中接收的:

          if(!empty($_FILES)){
        } 
    

    这里判断的的时候为空。

    12 条回复    2017-04-06 15:17:35 +08:00
    junbaor
        1
    junbaor  
       2017-04-01 11:42:31 +08:00
    zorui
        2
    zorui  
    OP
       2017-04-01 11:42:55 +08:00
    现在确定的就是 php 中 php.ini 配置 post_max_size 是大于要上传的文件的。
    zorui
        3
    zorui  
    OP
       2017-04-01 12:04:24 +08:00
    @junbaor jar 包中目前还不能换。
    hcymk2
        4
    hcymk2  
       2017-04-01 12:36:51 +08:00
    抓个包和与表单提交的对比下先.
    ijustdo
        5
    ijustdo  
       2017-04-01 12:46:52 +08:00
    呵呵 不要查肯定是 post 文件的时候 Content-Type 不对的呢 ^_^
    zorui
        6
    zorui  
    OP
       2017-04-01 13:21:32 +08:00
    Content-Type 都是 multipart/form-data
    zorui
        7
    zorui  
    OP
       2017-04-01 13:28:17 +08:00
    zorui
        8
    zorui  
    OP
       2017-04-01 13:33:07 +08:00
    8355
        9
    8355  
       2017-04-01 15:27:47 +08:00   ❤️ 1
    php://input 接收二进制流应该可以的.
    试试吧
    zorui
        11
    zorui  
    OP
       2017-04-06 15:14:00 +08:00
    @hcymk2
    @8355
    @ijustdo
    @zorui 找到原因了。通过 httpclient 出去的 header 中是使用的是 Transfer-Encoding: chunked , php5.3 不支持这个,只支持 Content-Length. 表单提交也是通过 Content-Length 所以就可以。 php5.4 是支持的。
    hcymk2
        12
    hcymk2  
       2017-04-06 15:17:35 +08:00
    @zorui
    你看了那 2 个连接里面的内容应该就知道了吧....
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3217 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:59 · PVG 20:59 · LAX 04:59 · JFK 07:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.