При загрузке одного файла с помощью <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"?> ... " } }
Я просто проверил отчет об ошибке 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); }
В приведенном выше коде могут быть некоторые ошибки «один за другим».