问题
When uploading one file using <input type="file" />
in Opera, it works as expected. That is, you find the expected file data in $_FILES in PHP server side.
However, when I try to upload several files at once using Opera, by setting <input type="file" min="1" max="999" />
then all the files' contents are glued together in one long string and sent as POST data. All the files in this string are separated by headers such as this:
------------94QV8HRqBwta8NY4L2WH0r
Content-Disposition: form-data; name="file[]"; filename="xxx1069225496.xml"
Content-Type: text/xml
<?xml>
...
Opera follows the Webforms 2.0 standard, I know. But is there a simple way to make Opera send multiple files in the same fashion other browsers do, or will I have to write an interpreter to get files just from Opera?
Thanks for any help. Below is the HTML I'm currently using.
<div id="filearea">
<input type="file" min="1" max="6000" accept="text/xml" name="file[]" style="padding: 1px; margin: 2px 0px;" />
</div>
This is how the var_dump of $_POST looks (I've erased any actual XML data, taking up space)
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:
I just checked a PHP bug report, and it claimed that this works in Opera:
<input type="file" name="file" min="1" max="999" />
But that this does not:
<input type="file" name="file[]" min="1" max="999" />
Edit: After testing this, I believe the PHP person who marked the bug as bogus didn't know what he was talking about... I cannot get either way to work natively with PHP.
As far as I can tell, PHP does not support Opera's 'mixed' file uploads. This is not a bug on Opera's part, as they are implementing it per the RFC's specification. I believe the other browsers simply upload the files as if there were multiple input elements. You could easily add support for this by checking the _POST array:
$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);
}
There may be some off-by one errors in the above code.
来源:https://stackoverflow.com/questions/3897149/how-do-i-make-opera-upload-files-like-other-browsers