Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP流/文件上载和最大输入变量_Php_Upload_Stream - Fatal编程技术网

PHP流/文件上载和最大输入变量

PHP流/文件上载和最大输入变量,php,upload,stream,Php,Upload,Stream,当我执行从Java到PHP的流上传时,我有时会收到一个PHP错误,说输入变量超过了max\u input\u vars的限制 起初,我不知道为什么。首先让我解释一下: 上传文件的方法与此类似: //从输入流获取文件数据 $putdata=fopen(“php://input“,“r”); $tmp=tmpfile(); filesize=stream\u copy\u to\u stream($putdata,$tmp); fclose($putdata); //将临时流复制到目标流 $tar

当我执行从Java到PHP的流上传时,我有时会收到一个PHP错误,说输入变量超过了
max\u input\u vars
的限制

起初,我不知道为什么。首先让我解释一下:

上传文件的方法与此类似:

//从输入流获取文件数据
$putdata=fopen(“php://input“,“r”);
$tmp=tmpfile();
filesize=stream\u copy\u to\u stream($putdata,$tmp);
fclose($putdata);
//将临时流复制到目标流
$target=fopen('myfile.dwg',“w”);
fseek($tmp,0,SEEK_SET);
流复制到流($tmp,$target);
fclose(目标美元);
fclose($tmp);
为了了解PHP为什么会给我这样的警告,我对发送的数据进行了转储:

file\u put\u contents('input\u vars.log',print\r($\u REQUEST,true));
file\u put\u contents('php\u input.log',file\u get\u contents('php://input'));
有趣的是: 正在上载的文件为1,8 MB。生成的日志包括:

  • input_vars.log
    =>5兆字节,90000行
  • php_input.log
    =>20兆字节,283000行
现在,错误信息突然变得合法了。
php\u input.log
只包含字节码,但是
input\u vars.log
的格式如下:

数组
(
[文件名]=>0018-101-001_67.dwg
[versionId]=>11253
[文件类型]=>dwg
[èÚè-8øFj–sÙ/ghÔ÷JJÐWhvPV]=>。。。
....
)
前三个键通过GET发送,其余的都是文件数据。如果我搜索并计算
=>
的匹配项,我会得到25954个匹配项。然后我假设
REQUEST
包含26000个键

现在,请回答我的问题: 我已经多次刷新了
max\u input\u vars
值,现在它的值为
30000
。我是否应该忽略此安全设置,并将其设置为尽可能高? 我担心的是,如果请求数组大于
30000
,PHP会从中删除部分,从而导致文件损坏


将此值设置得太高是否存在安全问题?是否有更好的方法将文件上传到PHP?

您没有展示如何用Java上传文件。PHP将普通POST请求视为来自表单,并尝试解析来自它们的字段——如果数据是二进制的,这是个坏主意。您最好模仿HTML文件上传表单的功能,并发送“多部分post”(an)。然后像从表单接收一样使用。

在其本身“php.net”()中,他们报告增加此设置的值没有问题,但是,这是一种“使用此指令缓解使用哈希冲突的拒绝服务攻击的可能性”的形式

要解决此僵局,您可以尝试在运行时使用以下函数设置变量值:

ini_set("max_input_vars", 30000);
我最近讨论了这个问题,以及调用是如何远程的,而不是如何配置运行时的,所以不幸的是,我们不得不增加值


到目前为止,我们还没有问题,但我们的想法是未来,修改代码以按部分发送数据,从而使代码保持在语言的标准当前配置内。

也许可以尝试将enable\u post\u data\u reading指令设置为“false”(或“Off”)以防止PHP解析文件体


顺便说一句,如果你使用的是PHP5.3.9,你应该修补max_input_vars。

你想做的是,你不应该把它当作帖子来处理;或者-至少-将
内容类型
HTTP头设置为
应用程序/octet流
尝试在php.ini中增加大小post\u max\u size、upload\u max\u filesize和max\u file\u uploads。接受的答案是有效的,但是您必须知道,关闭
启用发布数据读取
也意味着关闭自动填充
$发布
$获取
$请求
数组。由于我正在广泛使用这些阵列,我决定将
启用\u post\u data\u reading
限制为专用于文件上载的特定文件:

<Files "UploadFile.php">
    php_value enable_post_data_reading Off
</Files>
这样做,您就不需要使用
$\u REQUEST
$\u POST
,因为您可以通过以下方式在php中获得信息:


$fileName=$\u服务器['HTTP\u X\u文件名']

我无法从手册中读取是否可以通过ini_set()或htaccess设置此值。你知道答案吗?顺便说一下,据我记忆所及,我们使用的是PHP5.4.4.Via.htaccess。在它上面写着“variable-PHP_INI_PERDIR”(条目可以在PHP.INI、.htaccess、httpd.conf或.user.INI中设置(从PHP5.3开始)。应设置为“Off”以防止解析。无论如何,在设置phpinfo()后检查它是否有效。这实际上似乎解决了问题!非常感谢!:)很高兴我能帮忙,大卫!我们现在已经通过htaccess增加了设置(根据文档,在这种情况下,ini_set()是非法的)。但是,我们不能说我们设置的限制是否足够。这很复杂,您必须根据文件生成的索引数量在php.ini中从JAVA配置这个运行时变量。但是,因为您无法移动文件或路径并在PHP中执行处理,所以通过将内容缓冲到
HttpUrlConnection
的输出流中来上载文件,并在调用getInputStream()方法后有效地上载文件。
oXhr.setRequestHeader("X-File-Name", I_sFileName);
oXhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");