PHP没有从JAVA应用程序接收文件

时间:2015-02-19 16:46:18

标签: php file-upload

我无法修改的Java应用程序是通过POST请求将csv文件发送到我的PHP脚本。 $_POST$_FILES为空。

最大文件大小设置为5Mb,我的文件不会超过它。

以下是Java应用程序请求的wireshark转储:

http://i.stack.imgur.com/mFX6z.jpg

我如何使用PHP接收文件?

这是我的实际测试代码:

$old_error_handler = set_error_handler('myErrorHandler');
set_exception_handler('myExceptionHandler');

file_putcontents(dirname(__FILE__).DIRECTORY_SEPARATOR.'post.txt',
    print_r(array_merge($_REQUEST, $_FILES), true));

$expectedAmountOfDataInBytes = $_SERVER['CONTENT_LENGTH'];
$contents = '';
while(0 < $expectedAmountOfDataInBytes--) {
    $contents .= fread( STDIN, 1 );
}

fclose(STDIN);

file_put_contents(dirname(__FILE__).DIRECTORY_SEPARATOR.'file.csv', $contents);


function myErrorHandler($errno, $errstr, $errfile, $errline) {
    file_put_contents(dirname(__FILE__).DIRECTORY_SEPARATOR.'error.txt',
        print_r(array(
            'date'  => date(DateTime::W3C),
            'no'    => $errno,
            'error' => $errstr,
            'file'  => $errfile,
            'line'  => $errline
        ), true), FILE_APPEND);
    die();
}

function myExceptionHandler(Exception $exception) {
    file_put_contents(dirname(__FILE__).DIRECTORY_SEPARATOR.'error.txt',
        print_r(array(
            'date'    => date(DateTime::W3C),
            'code'    => $exception->getCode(),
            'file'    => $exception->getFile(),
            'Line'    => $exception->getLine(),
            'Message' => $exception->getMessage(),
            'Trace'   => $exception->getTrace()
        ), true), FILE_APPEND);
    die();
}

我的结果(post.txt):

Array
(
)

file.csv为空。

Web服务器规范:

  • 的Apache / 2.2.22
  • PHP 5.4.4-14

2 个答案:

答案 0 :(得分:0)

尝试打印$_FILES&amp; $_POST,如果两者都是空的,则Java应用程序代码中存在问题,因为每当您使用PHP获取文件时,它将位于$_FILES$_POST的任何键中(base64编码或任何其他编码)。

答案 1 :(得分:0)

http_get_request_bodyHttpResponse无法正常工作。现在PHP文档已经过时了。要使用它:\http\Env::getRequestBody()。请参阅doc

最终有效的解决方案(PHP 5.4):
php.ini中的Php配置:

enable_post_data_reading = 0

.htaccess

php_value enable_post_data_reading 0

Documentation

PHP代码:

$write = fopen(dirname(__FILE__).DIRECTORY_SEPARATOR.'test.csv','w+');
$read = fopen('php://input','r');
stream_copy_to_stream($read,$write);

使用enable-post-data-reading,您可以php://input使用multipart/form-data请求。