【问题标题】:How do I make Opera upload files like other browsers?如何让 Opera 像其他浏览器一样上传文件?
【发布时间】:2011-04-23 06:24:28
【问题描述】:

在 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"?>
...
    "
  }
}

【问题讨论】:

  • 另一个问题似乎是为什么 Opera 不允许他选择多个文件。 (因此,可能甚至不属于 SO。)这是关于 PHP 不会处理多个文件的原因。
  • HTML 中没有“min”或“max”这样的属性。这是一个 PHP 的东西,但我不记得当你使用 PHP 时它在浏览器中是如何工作的。
  • 实际上它是 WebForms 2.0 标准的东西,而不是 PHP 的东西,而且 afaik 只有 Opera 支持。这就是为什么我将这个问题标记为 Opera,而 Opera 是唯一可以复制我的问题的浏览器。我猜我的解决方案也仅限于 Opera,我可能不得不给 Opera 工作人员发电子邮件来帮助我。

标签: php html file input opera


【解决方案1】:

我刚刚检查了一个 PHP 错误报告,它声称这在 Opera 中有效:

<input type="file" name="file" min="1" max="999" />

但事实并非如此:

<input type="file" name="file[]" min="1" max="999" />

编辑:经过测试,我相信将错误标记为伪造的 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);
   }

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

【讨论】:

  • 我不明白你的意思。 type="file" 已经是我的代码了。如果您的意思是 name 而不是 type,则尝试这样做,但除了将 POST 字符串标题更改为此之外没有任何区别:Content-Disposition: form-data; name="file"; filename="1220713927.xml" Content-Type: text/xml
  • 对不起,我的意思是把 [] 放在名字上。据我所知,PHP 不能正确支持这一点。您可以手动分割边界,但简单地创建多个 INPUT 元素可能会更容易。
  • 当这个错误仅在使用 Opera 时出现,PHP 怎么可能不正确支持这个?对我来说,创建多个 INPUT 元素会更容易,真的。但遗憾的是,对于想要上传 50 个 XML 文档的用户来说,这并不容易。我仍然愿意接受更多建议!
  • 除了 Opera 之外,还有哪些浏览器支持此功能?无论如何,您可能需要考虑 plupload.com 之类的东西,因为您是对的,强制用户选择那么多不同的文档不是一个有效的解决方案。
  • 所有其他主流浏览器都支持此功能(Internet Explorer 除外),但通过 HTML5 和现在的 WebForms 2.0。 Opera 会选择像这样破坏自己的多文件上传确实让我感到奇怪,所以我认为我可以设置一个表单或输入属性来获得标准行为。
猜你喜欢
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多