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 服务器规格:
- Apache/2.2.22
- PHP 5.4.4-14
尝试打印 $_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
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
请求一起使用。
我无法修改的 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 服务器规格:
- Apache/2.2.22
- PHP 5.4.4-14
尝试打印 $_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
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
请求一起使用。