Как заставить Opera загружать файлы, как в других браузерах? - PullRequest
0 голосов
/ 09 октября 2010

При загрузке одного файла с помощью <input type="file" /> в Opera, он работает как положено.То есть ожидаемые данные файла находятся в $ _FILES на стороне сервера PHP.

Однако, когда я пытаюсь загрузить несколько файлов одновременно с помощью 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>

Так выглядит переменная var_dump в $ _POST (я стерла все фактические данные 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 Ответ

1 голос
/ 09 октября 2010

Я только что проверил отчет об ошибках 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);
   }

В приведенном выше коде могут быть отдельные ошибки.

...