2014-10-05 15 views
7

Tôi đang sử dụng trình thu thập để tải nhiều tệp cùng một lúc lên một thư mục cục bộ. Nhưng tôi gặp vài vấn đề.Xử lý tải lên với người bỏ qua trong sails.js (đang tiến hành)

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, 
        }); 

      }); 
     } 
    } 
}, 

Lỗi đầu tiên //---> 1 Nếu người dùng không đăng nhập, tôi muốn kết thúc quá trình tải lên này và trả về thành công = 0. Điều này không hoạt động. Ở phía khách hàng, yêu cầu được giữ treo mà không có bất kỳ phản hồi nào.

lỗi thứ hai //---> 2 Tôi đã gặp lỗi trước đó như được mô tả ở đây https://github.com/balderdashy/skipper/issues/36 và để khắc phục nhanh, tôi đã sử dụng những gì ai đó đã sử dụng trong nhận xét tại github. Nhưng một lần nữa như trong bài toán 1, tôi đã gặp phải vấn đề này. Nếu kích thước tệp vượt quá MAXBYTES, tôi muốn kết thúc quá trình tải lên này và trả về thành công = 0 cho người dùng. Không quay lại phía khách hàng.

lỗi thứ ba //---> 3 Tôi muốn sử dụng khi đang tiến hành để tạo thanh tiến trình. Nhưng tôi nhanh chóng gặp phải vài vấn đề. Trước hết, việc sử dụng tiến trình làm chậm hệ thống xuống quá nhiều. Ngoài ra nó dẫn đến một lỗi trong bước 4.

lỗi thứ tư //---> 4 Nếu chúng tôi xóa mục ('tiến trình') từ bước 3, hoạt động như mong đợi. Khi hoàn tất tải lên, nó sẽ trả về thành công = 1 cho khách hàng. Tuy nhiên, khi bật ('tiến trình') có mặt return res... trong bước //---> 4 không hoạt động và một lần nữa yêu cầu của khách hàng được giữ lại mà không có bất kỳ phản hồi nào.

vài câu hỏi: Tại sao không phải là công việc mã sau vào //---> 1 khi nó hoạt động trong //---> 4 nếu trên ('tiến bộ') không có mặt

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

Tại sao về tiến độ chậm quá trình tải lên rất nhiều?

Btw ở phía khách hàng của tôi, tôi sử dụng plugin form.js. Và do đó yêu cầu của tôi trông như thế này:

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

Trả lời

4

Tôi đã mất một thời gian để giải quyết việc này, và do thời gian tôi đã làm, tôi đã hoàn toàn quên về câu hỏi của tôi ở đây tại stackoverflow. Đây là một số bước tôi đã thực hiện để thực hiện công việc này.

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, 
       }); 
      } 
     }); 
    } 
}, 

Đây không phải là giải pháp tốt nhất. Tôi thực sự tìm thấy một số của nó hacky. Nếu có ai có giải pháp tốt hơn, hãy chia sẻ.

Các vấn đề liên quan