Domanda

Voglio consentire il caricamento di file di grandi dimensioni nella nostra applicazione PHP (centinaia di mega - 8 giga). Ci sono un paio di problemi con questo però.

Browser:

  • arrivi HTML hanno un feedback scadente, abbiamo bisogno di uno scrutinio per il progresso (che è un po 'sciocco) o Mostra nessun feedback a tutti
  • Flash uploader mette intero file in memoria prima di avviare il caricamento

Server:

  • PHP ci costringe a impostare post_max_size, che potrebbe tradursi in un attacco DOS facilmente sfruttabile. Mi piacerebbe non impostare questa impostazione a livello globale.
  • Il server richiede anche alcune altre variabili di essere lì in vars POST, come ad esempio una chiave segreta. Vorremmo essere in grado di rifiutare la richiesta subito, anziché dopo l'intero file viene caricato.

Requisiti:

  • HTTP è un must.
  • Sono flessibile con tecnologia client-side, fintanto che funziona in un browser.
  • PHP non è un requisito, se c'è qualche altra tecnologia che funziona bene su un ambiente Linux, che è perfettamente fresco.
È stato utile?

Soluzione

Che ne dite di un applet Java? Ecco come abbiamo dovuto farlo in una società che in precedenza lavorato per. So applet schifo, soprattutto in questo giorno di età e con tutte le nostre opzioni disponibili, ma in realtà sono la soluzione più versatile per problemi di tipo desktop incontrati nello sviluppo web. Solo una cosa da prendere in considerazione.

Altri suggerimenti

upload_max_filesize può essere impostato su un per- base directory; lo stesso vale per post_max_size

per esempio:.

<Directory /uploadpath/>
  php_value upload_max_filesize 10G
  php_value post_max_size 10G
</IfModule>

Python Handler?

Utilizzo di un gestore di Python POST invece di PHP. Genera un identificatore univoco dalla tua applicazione PHP che il cliente può mettere nelle intestazioni HTTP. Con mod_python di rifiutare o accettare la grande upload prima l'intero corpo POST viene trasmesso.

Credo http://www.modpython.org/live/current /doc-html/dir-handlers-hph.html

Consente di controllare le intestazioni e rifiutare il resto dell'ingresso POST. Non ho provato, ma potrebbe essere la strada giusta?

Guardando il sorgente del mod_python, il buffer di ingresso tramite read () sembra permettere la valutazione bit-at-a-tempo dell'ingresso HTTP. Intestazioni sono prima.

https://svn.apache.org/ repos / ASF / Quetzalcoatl / mod_python / trunk / src / filterobject.c

E 'Io so, ma forse qualcuno ha questo problema oggigiorno, anche. Ora è possibile farlo solo con Javascript e, diciamo, PHP. No Flash o Java tenuti sul lato client.

demo: http://dnduploader.filkor.org/

L'idea è quella di tagliare i file con una fetta di Blob di Javascript (metodo) ...

È possibile impostare il post_max_size solo per gli script in 1 directory. Inserite il vostro script di upload lì, e consentire solo lo script per gestire grandi dimensioni. E 'ancora possibile per quello script per essere attaccato con file di grandi dimensioni / inutili, ma evita l'impostazione a livello globale.

Usa che, con APC e si potrebbe essere in grado di lavorare fuori qualcosa di buono: IBM Developer lavora articolo su APC

Ho provato tutto questo ... questo è di gran lunga il migliore che ho usato ancora ...

http://www.uploadify.com/

Date un'occhiata a jumploader.com

Un buon java-applet per il caricamento.

L'ho usato per caricare le immagini e funziona benissimo. Non hanno provato con i file più grandi di 10 MB, ma devo lavorare per file di grandi dimensioni troppo.

Hai guardato in utilizzando APC per verificare lo stato di avanzamento e la dimensione totale del file. Ecco una buon post sul blog su di esso. Potrebbe essere utile.

Forse si potrebbe usare WebDAV e javascript nel browser

AJAX Big upload di file, con il progresso, a WebDAV

http://www.webdavsystem.com/ajax/programming/upload_progress

una semplice libreria

http://debris.demon.nl/projects/davclient js / doc / README.html

È possibile quindi ottenere il JS per reindirizzare l'utente a una pagina di successo. chiavi segrete e ciò che-non possono essere trattati in un preludio PHP prima di consegnare a mano il JS Client-> WebDAV

Vorrei guardare in FTP, SSH o SCP questo permette di caricare un file di grandi dimensioni ed ancora avere il controllo di accesso sul file pure. Questo potrebbe richiedere un po 'più tempo per implementare, ma la sua probabilmente il modo più sicuro che potrei pensare a.

Ho avuto successo con uploadify , e lo consiglio. Si tratta di uno script jQuery / Flash che gestisce grandi arrivi, e si può passare parametri aggiuntivi ad esso (come la chiave segreta). Per risolvere i problemi lato server, è sufficiente utilizzare il seguente codice. I cambiamenti abbiano effetto solo per la sceneggiatura si chiamano in:

//Check to see if the key is there
if(!isset($_POST['secret_key']) || !isValid($_POST['secret_key']))
{
    exit("Invalid request");
}
function isValid($key)
{
    //Put your validation code here.
}

//This line changes the timeout.
//Give it a value in seconds (3600 = 1 hour)
set_time_limit(3600);

//Set these amounts to whatever you need.
ini_set("post_max_size","8192M");
ini_set("upload_max_filesize","8192M");

//Generally speaking, the memory_limit should be higher
//than your post size.  So make sure that's right too.
ini_set("memory_limit","8200M");

Modifica In risposta al tuo commento:

Dato quello che hai detto, ho paura che potrebbe non essere in grado di soddisfare le vostre esigenze su HTTP. Tutte le soluzioni fuori ci sono il codice che aggiungono funzionalità per HTTP che non è mai stato progettato per.

Come hai detto tu stesso, si tratta di un semplice protocollo. Oltre a scrivere il proprio software client proprio che corre al di fuori del browser, un applet Java, o utilizzando un protocollo diverso (come FTP, che è stato progettato per questo), si potrebbe non ottenere quello che vuoi.

Ho fatto del mio meglio entro i vincoli indicati. Mi dispiace di non poter fare di meglio.

Lo so che fa schifo per aggiungere un altro dipendenza ma nella mia esperienza, la maggior parte dei siti web che stanno facendo qualcosa di simile si utilizza il flash sul lato client, e caricare il file di grandi dimensioni come pezzi

Adobe come un howto sul caricamento dei file flash

Ho trovato anche questo tutorial su CodeProject:

multipla Upload File Con Barra di avanzamento Uso di Flash e ASP.NET

PS - So che si sta utilizzando PHP e non .net, ho pensato che la parte importante è stata il flash;)

Prova questo: http://www.simple2ftp.com utilizza un applet FTP basato su Java dall'interno di un intelligente PHP applicazione wrapper.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top