Php 如何让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

在Opera中使用
上载一个文件时,它会按预期工作。也就是说,您可以在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);
   }