2014-10-05 15 views
7

Sto utilizzando skipper per caricare più file contemporaneamente in una cartella locale. Ma ho incontrato pochi problemi.Gestione caricamenti con skipper in sails.js (in corso)

upload: function (req, res) { 
    if (_.isEmpty(req.session.User)){ 
     return res.json({          //---> 1 
        success: 0 
       }); 
    }else{ 
     res.setTimeout(0); 
     var MAXBYTES = 10*1000*1000; 

                   //---> 2 
     if (req._fileparser.form.bytesExpected > MAXBYTES){ 
      return res.json({ 
       success: 0, 
       error: 'File size limit exceeded.' 
      }); 
     }else{ 

      req.file('file[]').on('progress', function(event){ 
       return event;         //---> 3 
      }).upload({ 

       maxBytes: MAXBYTES 

      }, function whenDone(err, uploadedFiles) { 
                   //---> 4 
        return res.json({ 
         success: 1, 
        }); 

      }); 
     } 
    } 
}, 

primo errore //---> 1 Se l'utente non è connesso voglio terminare questo processo di caricamento e tornare successo = 0. Questo non funziona. Sul lato client la richiesta viene mantenuta sospesa senza alcuna risposta.

secondo errore //---> 2 Ho avuto un errore in precedenza come descritto qui https://github.com/balderdashy/skipper/issues/36 e così come una soluzione rapida ho usato quello che qualcuno ha usato nei commenti su github. Ma ancora come nel problema 1, mi sono imbattuto in questo problema. Se la dimensione del file supera quella di MAXBYTES, voglio terminare questo processo di caricamento e restituire successo = 0 all'utente. Il non sta tornando al lato client.

terzo errore //---> 3 Voglio utilizzare in corso per creare una barra di avanzamento. Ma ho subito incontrato alcuni problemi. Prima di tutto, l'uso dei progressi rallenta troppo il sistema. Inoltre porta ad un errore nel 4 ° passo.

quarto errore //---> 4 Se rimuoviamo l'opzione on ("avanzamento") dal passaggio 3, funziona come previsto. Al termine del caricamento, restituisce successo = 1 al client. Tuttavia, quando è attivo ("avanzamento"), return res... nel passaggio //---> 4 non funziona e, ancora una volta, la richiesta del client viene mantenuta sospesa senza alcuna risposta.

alcune domande: Perché non i seguenti lavori codice //---> 1 mentre si lavora in //---> 4 se il ('progresso') non è presente

return res.json({ 
    success: 0 
}); 

Perché il sui progressi rallentare il processo di caricamento così tanto?

Btw sul lato client utilizzo il plugin form.js. E quindi la mia richiesta è simile al seguente:

$('#upload').ajaxForm({ 
    uploadProgress: function(event, position, total, percentComplete){ 
     console.log(percentComplete); 
    }, 
    success: function(data) { 
     console.log(data); 
    } 
}); 

risposta

4

Mi c'è voluto del tempo per risolvere questo problema, e per il momento l'ho fatto, mi ero completamente dimenticato la mia domanda qui a StackOverflow. Questi sono alcuni dei passi che ho fatto per far funzionare questo.

upload: function (req, res) { 
    if (_.isEmpty(req.session.User)){ 
     return res.json({ // or destroy connection as shown below 
      success: 0 
     }); 
    }else{ 
     res.setTimeout(0); 
     var MAXBYTES = 10*1000*1000; 

     if (req._fileparser.form.bytesExpected && req._fileparser.form.bytesExpected > MAXBYTES) { 
      // file size exceeded //-> also check filesize on client-size before uploading because this will not send error report back to the client 
      req.connection.destroy(); 
     } 

     req.file('file[]').on('progress', function(event){ 
      // returning anything here was unnecessary 
      // For example jQuery form plugin's client-side `uploadProgress:` will still catch the progress 
     }).upload({ 
      maxBytes: MAXBYTES 
     }, function whenDone(err, uploadedFiles) { 
      var tempFileNames = _.pluck(uploadedFiles, 'fd'); 
      if (_.isEmpty(tempFileNames)) { 
       return res.json({ 
        success: 0, 
        error: '0 files selected.' 
       }); 
      }else{ 
       // process upload 
       return res.json({ 
        success: 1, 
       }); 
      } 
     }); 
    } 
}, 

Questa non è ancora la soluzione migliore. In realtà ne trovo un po 'hacky. Se qualcuno ha una soluzione migliore, per favore condividi.