2013-04-02 139 views
6

經過幾周的調整,我終於放棄了。我只是無法修復我在Safari上的多個文件上傳,這真的讓我困擾,因爲我的代碼在其他瀏覽器上運行完美,除了Safari瀏覽器。然後我剛剛發現它不是我的代碼有問題。它是一個Safari錯誤。 Safari 5.1。+無法讀取html5多個屬性(或類似的東西)。所以用戶不能使用多種上傳功能,但是,可以正確上傳單個文件。Safari HTML5多文件上傳錯誤的任何解決方法?

認爲討論這個問題幾個環節:

https://github.com/moxiecode/plupload/issues/363

file input size issue in safari for multiple file selection

看來,這個漏洞已經存在了相當長的一段時間。所以我想知道在你們中有些人可能知道的情況下是否有可用的解決方法?因爲我找不到任何東西。我發現的唯一選擇是不爲Safari 5.1。+用戶使用多個屬性。你們有更好的想法嗎?

UPDATE

的Safari 5.1.7是最後一個版本的蘋果Windows操作系統做。他們沒有繼續構建當前版本的Windows for Safari。找到一個修復這個錯誤對我來說是沒有必要的,因爲房地產 Safari用戶更新到瀏覽器(沒有事實)的最新版本,並只給那些誰仍在使用這種過時的版本,一個單獨的上傳,到不會犧牲您的應用程序的現代功能。

+0

我把我的文件上載到'''sequentialUploads:true''',我沒有更多的問題 –

回答

1

這是老氣的問題,但...黑客式的解決方法如下。

只需刪除多個屬性的Safari,把它變成MSIE < = 9小弟弟(非XHR)。瀏覽器的

其餘部分將不會受到影響。

當Safari瀏覽器終於​​解決問題,所有你需要做的就是消除這種黑客::代碼,並返回到標準輸入代碼。

這裏是標準輸入樣本:

 
<input class="fileupload-input" type="file" name="files[]" multiple /> 

jQuery的解決方案:

只要將它放在一個頁面,在這裏你有文件輸入標籤上。

你可以在這裏閱讀更多:How to detect Safari, Chrome, IE, Firefox and Opera browser?

 
$(document).ready(function() { 
    if (Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor')>0); 
     $('.fileupload-input').removeAttr("multiple"); 
}); 

PHP解決方案

你需要一些代碼來標識瀏覽器我用了一個類我有一個在github上(MIT) 得到它在這裏:https://github.com/gavroche/php-browser

 
$files = '<input class="fileupload-input" type="file" name="files[]" multiple />'; 
if (Browser::getBrowser() === Browser::SAFARI) { 
    $files = '<input class="fileupload-input" type="file" name="files[]" />'; 
} 
echo $files 

就是這樣。

+0

我試過這個。但仍然丟失文件。 – IMRUP

0

似乎還有另一個問題可以搞亂。 iOS Safari多文件上傳對所有上傳的文件總是使用名稱「image.jpg」。它似乎只有一個文件上傳到服務器端,但這不是發生了什麼事:它已經上傳了所有具有相同名稱的文件!

因此,解決方法進入服務器端:只需使用新生成的名稱更改目標文件名即可。

我正在使用Flask和Python,所以我使用標準公式。

@app.route("/upload",methods=['POST']) 
def upload(): 
    files = request.files.getlist('files[]') 
    for file in files: 
     if file and allowed_file(file.filename): 
      filename = generate_filename(file.filename) 
      file.save(os.path.join(app.config['UPLOAD_FOLDER'], new_album_id, filename)) 
    return render_template('upload_ok.html') 

generate_filaname必須創建具有相同的延伸原有的一個新的文件名的功能。例如:

def generate_filename(sample_filename): 
    # pick up extension from sample filename 
    ext = sample_filename.split(".")[-1] 
    name = ''.join(random.SystemRandom().choice(string.letters+string.digits) for i in range(16)) 
    return name + "." + ext 

當然,PHP也可以做到這一點。

相關問題