Как сделать файлы загрузки Opera похожими на другие браузеры?

При загрузке одного файла с помощью <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"?> ... " } } 

Solutions Collecting From Web of "Как сделать файлы загрузки Opera похожими на другие браузеры?"

Я просто проверил отчет об ошибке PHP, и он утверждал, что это работает в Opera:

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

Но это не так:

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

Edit: после тестирования этого, я считаю, что человек 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); } 

В приведенном выше коде могут быть некоторые ошибки «один за другим».