PHP 没有收到来自 JAVA 应用程序的文件

PHP didn't receive file from JAVA app

我无法修改的 Java 应用程序正在通过 POST 请求向我的 PHP 脚本发送一个 csv 文件。 $_POST$_FILES 为空。

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

这是 Java 应用请求的 wireshark 转储:

如何使用 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 服务器规格:

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

http_get_request_body or HttpResponse didn't work. And now the PHP doc is outdated. To use it: \http\Env::getRequestBody(). See the doc.

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

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://inputmultipart/form-data 请求一起使用。