我无法修改的Java应用程序是通过POST
请求将csv文件发送到我的PHP脚本。 $_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服务器规范:
答案 0 :(得分:0)
尝试打印$_FILES
&amp; $_POST
,如果两者都是空的,则Java应用程序代码中存在问题,因为每当您使用PHP获取文件时,它将位于$_FILES
或$_POST
的任何键中(base64编码或任何其他编码)。
答案 1 :(得分:0)
http_get_request_body
或HttpResponse
无法正常工作。现在PHP文档已经过时了。要使用它:\http\Env::getRequestBody()
。请参阅doc。
最终有效的解决方案(PHP 5.4):
php.ini
中的Php配置:
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
请求。