如何像其他浏览器一样制作Opera上传文件?

时间:2010-10-09 17:33:20

标签: php html file input opera

在Opera中使用<input type="file" />上传一个文件时,它按预期工作。也就是说,您在PHP服务器端的$ _​​FILES中找到了预期的文件数据。

但是,当我尝试使用Opera一次上传多个文件时,通过设置<input type="file" min="1" max="999" />,然后将所有文件的内容粘贴在一个长字符串中并作为POST数据发送。此字符串中的所有文件都由标题分隔,如下所示:

------------94QV8HRqBwta8NY4L2WH0r
Content-Disposition: form-data; name="file[]"; filename="xxx1069225496.xml"
Content-Type: text/xml

<?xml>
...

我知道Opera遵循Webforms 2.0标准。但有没有一种简单的方法可以让Opera以与其他浏览器相同的方式发送多个文件,或者我是否必须编写一个解释器才能从Opera中获取文件?

感谢您的帮助。以下是我目前正在使用的HTML。


<div id="filearea">
    <input type="file" min="1" max="6000" accept="text/xml" name="file[]" style="padding: 1px; margin: 2px 0px;" />
</div>

这就是$ _POST的var_dump看起来的样子(我删除了任何实际的XML数据,占用了空间)

array(1) {
  ["file"]=>
  array(1) {
    [0]=>
    string(4209) "------------94QV8HRqBwta8NY4L2WH0r
Content-Disposition: form-data; name="file[]"; filename="1219854274.xml"
Content-Type: text/xml

<?xml version="1.0"?>
...

------------94QV8HRqBwta8NY4L2WH0r
Content-Disposition: form-data; name="file[]"; filename="xxx1069225496.xml"
Content-Type: text/xml

<?xml version="1.0"?>
...

------------94QV8HRqBwta8NY4L2WH0r
Content-Disposition: form-data; name="file[]"; filename="xxx1111008062.xml"
Content-Type: text/xml

<?xml version="1.0"?>
...

------------94QV8HRqBwta8NY4L2WH0r
Content-Disposition: form-data; name="file[]"; filename="1219854274.xml"
Content-Type: text/xml

<?xml version="1.0"?>
...
    "
  }
}

1 个答案:

答案 0 :(得分:1)

我刚检查了一个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的一个错误,因为他们按照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);
   }

上述代码中可能存在一些错误的错误。