2011-02-01 89 views
8

我已經在JS(AJAX POST)中設置了拖放文件上傳腳本,並且在Safari瀏覽器中篩選文件夾有困難 - 版本5.0.3 (6533.19.4)。HTML5拖放 - 在Safari瀏覽器中檢測文件夾(FileList,文件)

每當我將多個文件/文件夾拖放到瀏覽器中時,Chrome瀏覽器會過濾掉這些文件夾,並且Firefox將返回0代表.size,因此防止出現這些情況很簡單。 然而,Safari會返回一個68字節的文件(文件夾的大小)。

有什麼方法可以測試這個FileFileList中的項目)是否是一個文件夾? 似乎無法找到在此條件測試File/Blob API任何東西(在試圖.type沒有意義的,因爲它不返回任何未知文件以及文件夾...)更多

有點信息:

基本上發生的事情是AJAX請求有一個空的主體。我與FormData上傳:

var file = ...; // the dropped file 
var formData = new FormData(); 
formData.append("file", file); 
var xhr = new XMLHttpRequest(); 
... 
xhr.send(formData); 
+1

我張貼這種錯誤報告:https://bugs.webkit.org/show_bug.cgi?id= 63898 – meleyal 2011-07-04 12:05:52

+0

最新版本的Chrome似乎與Safari一樣呈現相同的問題。你有沒有什麼運氣能夠追蹤這些過濾的標準方法? – 2011-08-29 17:06:02

回答

-2

爲什麼不檢查舊校園的文件後綴?應該在大多數情況下,「file.suf」是一個文件,「文件」是一個文件夾工作...

0

你可以檢測它是否是使用原始數據後在服務器上的文件或文件夾: Get raw post data

我注意到,文件夾只有在開始處形成邊界而在結尾處沒有。所以基本上它看起來像瀏覽器開始做這個帖子,然後在完成請求之前停下來。 (我只用safari測試過,但我猜這跟其他瀏覽器一樣。)

您可以將失敗的上傳保存在會話中,然後使用AJAX測試失敗的上傳是否生成了這樣的請求。你確實有一個附加的AJAX請求,但至少你可以檢測到它。這是迄今爲止我發現的最佳選擇。

0

我們可以通過FileReader來讀取文件。代碼可以是這樣的:

Array.prototype.forEach.call(e.dataTransfer.files, function (file) { 
    var reader = new FileReader(); 
    reader.onload = function (event) { 
    // it's a file 
    addFile(file); 
    }; 
    reader.onerror = function (event) { 
    alert("Uploading folders not supported in Safari"); 
    } 
    reader.readAsDataURL(file); 
}); 

對於文件夾,它會給錯誤:

Failed to load resource: The operation couldn’t be completed. (WebKitBlobResource error 4.)