php - para - ¿Cómo hago que Opera cargue archivos como otros navegadores?
subir archivos angular 4 (1)
Al cargar un archivo usando <input type="file" />
en Opera, funciona como se esperaba. Es decir, encuentra los datos de archivo esperados en $ _FILES en el lado del servidor PHP.
Sin embargo, cuando intento cargar varios archivos a la vez usando Opera, estableciendo <input type="file" min="1" max="999" />
, todos los contenidos de los archivos se pegan en una cadena larga y se envían como datos POST. Todos los archivos en esta cadena están separados por encabezados como este:
------------94QV8HRqBwta8NY4L2WH0r
Content-Disposition: form-data; name="file[]"; filename="xxx1069225496.xml"
Content-Type: text/xml
<?xml>
...
Opera sigue el estándar Webforms 2.0, lo sé. ¿Pero existe una forma simple de hacer que Opera envíe múltiples archivos de la misma manera que otros navegadores, o tendré que escribir un intérprete para obtener archivos solo de Opera?
Gracias por cualquier ayuda. Debajo está el HTML que estoy usando actualmente.
<div id="filearea">
<input type="file" min="1" max="6000" accept="text/xml" name="file[]" style="padding: 1px; margin: 2px 0px;" />
</div>
Así es como se ve el var_dump de $ _POST (he borrado cualquier dato XML real, ocupando espacio)
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"?>
...
"
}
}
Acabo de consultar un informe de error de PHP, y afirmó que esto funciona en Opera:
<input type="file" name="file" min="1" max="999" />
Pero eso no:
<input type="file" name="file[]" min="1" max="999" />
Editar: Después de probar esto, creo que la persona de PHP que marcó el error como falso no sabía de qué estaba hablando ... No puedo trabajar de forma nativa con PHP.
Por lo que puedo decir, PHP no admite la carga de archivos "mixtos" de Opera. Esto no es un error por parte de Opera, ya que lo están implementando según las especificaciones del RFC. Creo que los otros navegadores simplemente cargan los archivos como si hubiera múltiples elementos de entrada. Puede agregar soporte para esto fácilmente al verificar la matriz _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);
}
Puede haber algunos errores de desconexión por uno en el código anterior.