簡體   English   中英

如何使Opera像其他瀏覽器一樣上傳文件?

[英]How do I make Opera upload files like other browsers?

在Opera中使用<input type="file" />上傳一個文件時,它可以正常工作。 也就是說,您可以在PHP服務器端的$ _​​FILES中找到所需的文件數據。

但是,當我嘗試使用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>

這就是$ _POST的var_dump的外觀(我已經刪除了所有實際的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" />

編輯:經過測試,我相信標記該錯誤為偽造錯誤的PHP人員不知道他在說什么。。。

據我所知,PHP不支持Opera的“混合”文件上傳。 這並不是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);
   }

上面的代碼中可能存在一些錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM