Php 如何让Opera像其他浏览器一样上传文件?
在Opera中使用Php 如何让Opera像其他浏览器一样上传文件?,php,html,file,input,opera,Php,Html,File,Input,Opera,在Opera中使用上载一个文件时,它会按预期工作。也就是说,您可以在PHP服务器端的$\文件中找到所需的文件数据 但是,当我尝试使用Opera同时上传多个文件时,通过设置,所有文件的内容都被粘在一个长字符串中,并作为POST数据发送。此字符串中的所有文件都由如下标题分隔: ------------94QV8HRqBwta8NY4L2WH0r Content-Disposition: form-data; name="file[]"; filename="xxx1069225496.xml" Co
上载一个文件时,它会按预期工作。也就是说,您可以在PHP服务器端的$\文件中找到所需的文件数据
但是,当我尝试使用Opera同时上传多个文件时,通过设置
,所有文件的内容都被粘在一个长字符串中,并作为POST数据发送。此字符串中的所有文件都由如下标题分隔:
------------94QV8HRqBwta8NY4L2WH0r
Content-Disposition: form-data; name="file[]"; filename="xxx1069225496.xml"
Content-Type: text/xml
<?xml>
...
-----------94QV8HRqBwta8NY4L2WH0r
内容配置:表单数据;name=“file[]”;filename=“xxx1069225496.xml”
内容类型:text/xml
...
我知道Opera遵循Webforms 2.0标准。但是有没有一种简单的方法可以让Opera像其他浏览器一样发送多个文件,或者我需要编写一个解释器才能从Opera中获取文件
谢谢你的帮助。下面是我目前使用的HTML
这就是$u POST的var_转储的外观(我已经删除了所有实际的XML数据,占用了空间)
数组(1){
[“文件”]=>
阵列(1){
[0]=>
字符串(4209)”------94QV8HRqBwta8NY4L2WH0r
内容配置:表单数据;name=“file[]”;filename=“1219854274.xml”
内容类型:text/xml
...
------------94QV8HRqBwta8NY4L2WH0r
内容配置:表单数据;name=“file[]”;filename=“xxx1069225496.xml”
内容类型:text/xml
...
------------94QV8HRqBwta8NY4L2WH0r
内容配置:表单数据;name=“file[]”;filename=“xxx1111008062.xml”
内容类型:text/xml
...
------------94QV8HRqBwta8NY4L2WH0r
内容配置:表单数据;name=“file[]”;filename=“1219854274.xml”
内容类型:text/xml
...
"
}
}
我刚刚检查了一份PHP错误报告,它声称这在Opera中有效:
<input type="file" name="file" min="1" max="999" />
但这并不是:
<input type="file" name="file[]" min="1" max="999" />
编辑:经过测试,我相信那个将这个bug标记为假的PHP人员不知道他在说什么。。。我无法以任何一种方式在本机使用PHP
据我所知,PHP不支持Opera的“混合”文件上传。这不是Opera的一个bug,因为他们是根据RFC的规范来实现的。我相信其他浏览器只是简单地上传文件,就好像有多个输入元素一样。您可以通过检查_POST数组轻松添加对此的支持:
$file = $_POST['file'][0];
while (preg_match('/^(-+[A-Za-z0-9]+)\s+/', $file, $matches))
{
$id = $matches[1];
$i = strlen($matches[0]);
$body = false;
$headers = array();
while (($j = strpos($file, "\n", $i)) !== false)
{
$line = substr($file, $i, $j - $i);
$i = $j + 1;
if (trim($line) == '')
{
$body = true;
break;
}
list($key, $val) = explode(':', trim($line), 2);
$headers[$key] = trim($val);
}
if (!$body) break;
$j = strpos($file, $id, $i);
$data = substr($file, $i, $j-$i);
echo $data."<HR>"; // also check $headers
$file = substr($file, $j);
}
$file=$\u POST['file'][0];
while(preg_match('/^-+[A-Za-z0-9]+)\s+/',$file,$matches))
{
$id=$matches[1];
$i=strlen($matches[0]);
$body=false;
$headers=array();
while(($j=strpos($file,“\n”,$i))!==false)
{
$line=substr($file,$i,$j-$i);
$i=$j+1;
如果(修剪($line)='')
{
$body=true;
打破
}
列表($key,$val)=分解(“:”,修剪($line),2);
$headers[$key]=修剪($val);
}
如果(!$body)中断;
$j=strpos($file,$id,$i);
$data=substr($file,$i,$j-$i);
echo$data.“
”;//同时检查$headers
$file=substr($file,$j);
}
上述代码中可能存在一些逐个错误。另一个问题可能重复,那就是为什么Opera不允许他选择多个文件。(因此,甚至可能不属于SO。)这篇文章是关于为什么PHP不会处理多个文件的。HTML中没有像“min”或“max”这样的属性。这是一个PHP的东西,但我不记得当你使用PHP时它是如何在浏览器中工作的。实际上,它是WebForms 2.0标准的东西,而不是PHP的东西,而且它只有Opera支持。这就是为什么我将这个问题标记为Opera,Opera是唯一可以复制我的问题的浏览器。我猜我的解决方案也只能是Opera,我可能不得不给Opera的员工发电子邮件来帮助我。我不明白你的意思
type=“file”
已经是我的代码。如果您指的是name
,而不是type
,则会尝试这样做,但除了将POST字符串标题更改为以下内容外,没有任何区别:Content-Disposition:form-data;name=“file”;filename=“1220713927.xml”内容类型:text/xml
对不起,我是想在名字上加上[]。据我所知,PHP不支持这一点。您可以手动分割边界,但简单地创建多个输入元素可能会更容易。当此错误仅在使用Opera时发生时,PHP如何不正确支持此操作?对我来说,创建多个输入元素会更容易,没错。但遗憾的是,对于想要上传50个XML文档的用户来说,这并不容易。我仍然欢迎更多的建议!除了Opera,还有哪些浏览器支持此功能?无论如何,你可能想考虑一些事情,因为你是正确的,迫使用户选择许多不同的文档不是一个有效的解决方案。所有其他主要浏览器支持这一点(除了Internet Explorer),但通过HTML5和现在的WebForm 2。Opera会选择像这样破坏自己的多文件上传,这确实让我感到奇怪,因此我假设可以设置一个表单或输入属性来获得标准行为。
<input type="file" name="file[]" min="1" max="999" />
$file = $_POST['file'][0];
while (preg_match('/^(-+[A-Za-z0-9]+)\s+/', $file, $matches))
{
$id = $matches[1];
$i = strlen($matches[0]);
$body = false;
$headers = array();
while (($j = strpos($file, "\n", $i)) !== false)
{
$line = substr($file, $i, $j - $i);
$i = $j + 1;
if (trim($line) == '')
{
$body = true;
break;
}
list($key, $val) = explode(':', trim($line), 2);
$headers[$key] = trim($val);
}
if (!$body) break;
$j = strpos($file, $id, $i);
$data = substr($file, $i, $j-$i);
echo $data."<HR>"; // also check $headers
$file = substr($file, $j);
}