2013-04-02 8 views
6

Dopo settimane di modifiche ho finalmente rinunciato. Non sono riuscito a correggere il caricamento multiplo di file su Safari, il che mi ha davvero infastidito perché il mio codice funzionava perfettamente come dovrebbe su altri browser, ad eccezione di Safari. Poi ho scoperto di recente che non è il mio codice che ha il problema. È un bug di Safari. Safari 5.1. + Non può leggere l'attributo multiplo html5 (o qualcosa del genere). Quindi, gli utenti non possono utilizzare la funzione di caricamento multiplo, MA, possono caricare correttamente un singolo file.Eventuali soluzioni alternative per il bug di caricamento di file multipli di Safari HTML5?

alcuni link che discutono la questione:

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

file input size issue in safari for multiple file selection

sembra che questo bug è stato intorno per un bel po 'di tempo. Quindi mi chiedevo se ci sono soluzioni alternative per questo al momento che alcuni di voi forse sono a conoscenza? Perché non riesco a trovarne. L'unica opzione disponibile che ho trovato è NON usare più attributi per Safari 5.1. + Utenti. Avete qualche idea migliore?

UPDATE

Safari 5.1.7 è l'ultima versione Apple ha fatto per il sistema operativo di Windows. Non hanno continuato a creare versioni correnti di Safari per Windows. Non è necessario trovare una correzione per questo bug dal Real Gli utenti di Safari sono aggiornati all'ultima versione del browser (senza dati) e basta fornire un caricamento separato per coloro che stanno ancora utilizzando questa versione obsoleta, per non sacrificare le funzionalità moderne della tua applicazione.

+0

Ho caricato il fileup in '' 'sequentialUploads: true''' e non ho avuto più problemi –

risposta

1

Questa è una domanda obsoleta, ma ... la soluzione alternativa di tipo hack è riportata di seguito.

Basta rimuovere più attributo per Safari, trasformarlo in MSIE < = 9 fratellino (non XHR).

Il resto dei browser non sarà interessato.

Quando Safari risolve il problema, tutto ciò che devi fare è rimuovere questo codice hack :: e tornare al codice di input standard.

qui è campione input standard:

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

soluzione jQuery:

Il posto giusto da qualche parte su una pagina, in cui si dispone di tag di file di input.

si può leggere di più qui: 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"); 
}); 

soluzione PHP

avrete bisogno di qualche codice al browser id ho usato una classe ho avuto uno in github (MIT) arrivare qui : 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 

Questo è tutto.

+0

Ho provato questo. ma manca ancora il file. – IMRUP

0

Sembra che ci sia un altro problema che può essere un problema. I caricamenti multipli di file di Safari di iOS utilizzano sempre il nome "image.jpg" per tutti i file caricati. Potrebbe sembrare solo un file caricato sul lato server, ma questo non è quello che è successo: sono stati caricati tutti i file con lo stesso nome!

Quindi, la soluzione alternativa viene dal lato server: basta cambiare il nome file di destinazione con un nuovo nome generato.

Sto lavorando con Flask e Python, quindi uso la formula standard.

@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') 

Dove generate_filaname deve essere una funzione che crea un nuovo nome con la stessa estensione di quello originale. Ad esempio:

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 

Lo stesso può essere fatto in PHP, ovviamente.

Problemi correlati