Domanda

So che questo tipo di domande esiste in SF, ma sono molto specifici, ho bisogno di un suggerimento generico. Ho bisogno di una funzione per il caricamento di file utente che potrebbero essere di dimensioni più di 1 GB. Questa caratteristica sarà un add-on per il già esistente di caricamento file caratteristica presente nella domanda che si rivolge a file più piccoli. Ora, qui ci sono alcune delle opzioni

  1. Usa HTTP e applet Java. Inviare i file in blocchi e unirsi a loro sul server. Ma come a manetta il n / w.
  2. Usa HTTP e l'applicazione Flex. È meglio di una compatibilità con i browser WRT applet e altre questioni ambientali?
  3. Usa FTP o SFTP, piuttosto, piuttosto HTTP che come un protocollo per la procedura di caricamento più veloce

Si prega di suggerire.

Inoltre, ho da fare in modo che questo processo di caricamento non ostacolino il compito di altri utenti o in altre parole non mangiare fino b di altri utenti / w. Eventuali meccanismi che può essere fatto a n / w livello di strozzare tali processi?

In definitiva cliente voleva avere FTP come opzione. Ma credo che la risposta con la gestione dei file di programmazione è anche fresco.

È stato utile?

Soluzione

Per l'invio di file su un server, a meno che non si sono per utilizzare HTTP, FTP è la strada da percorrere. Throttling, io non sono del tutto sicuro di, almeno non a livello di codice.

Personalmente, sembra che le limitazioni della velocità di upload sarebbe meglio compiuta sul lato server però.

Altri suggerimenti

Usare qualsiasi linguaggio lato client che si desidera (un App Java, Flex, ecc), e spingere al server con HTTP PUT (senza Flex) o POST. Nel codice Java lato server, regolare il flusso di byte nel loop flusso di input. Un grezzo, semplice, frammento di campione che limita la larghezza di banda a non più veloce di una media <= 10KB / secondo:

InputStream is = request.getInputStream();
OutputStream os =  new FileOutputStream(new File("myfile.bin"));
int bytesRead = 0;
byte[] payload = new byte[10240];

while (bytesRead >= 0) {
    bytesRead = is.read(payload);

    if (bytesRead > 0) 
        os.write(payload, 0, bytesRead);

    Thread.currentThread().sleep(1000);
}

(con una maggiore complessità si può regolare con maggiore precisione la larghezza di banda singolo flusso, ma diventa complessa quando si considerano i buffer di socket e così via. "Good enough" di solito è sufficiente buono.)

La mia applicazione fa qualcosa di simile a quanto sopra - abbiamo regolare sia verso l'alto (POST e PUT) e (GET) a valle della larghezza di banda. Accettiamo file nelle 100s di MB ogni giorno e abbiamo testato fino a 2GB. (Oltre 2GB c'è i fastidiosi Java int questioni primitive da affrontare.) I nostri clienti sono sia Flex e curl. Funziona per me, può funzionare per voi.

Mentre FTP è grande e tutti, si può evitare molti (ma non tutti) i problemi di firewall utilizzando HTTP.

Se si vuole ridurre la larghezza di banda si può decidere di inviare i dati compressi (a meno che la sua compressi già) Questo può risparmiare 2-3 volte il volume di dati a seconda di cosa si sta inviando.

Per un esempio di buona pratica per il caricamento di file di grandi dimensioni, ed i vari modi di affrontarlo, uno sguardo a flickr.com (potrebbe essere necessario iscriversi per accedere alla pagina uploader)

Essi forniscono varie opzioni, tra cui caricare modulo HTTP, un client java desktop, o un qualche tipo di gadget javascript-driven che non riesco a capire. Essi non sembrano utilizzare il flash da nessuna parte.

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