2011-10-22 22 views
35

Tôi đang tạo một ứng dụng cần tải lên một số tệp và gửi chúng thẳng lên S3. Tôi không muốn thậm chí có các tập tin tmp trên máy chủ của tôi, vì vậy tôi đang sử dụng mô-đun Knox và muốn lấy dòng thô từ Formidable và gửi nó qua Knox đến S3. Tôi đã làm điều gì đó tương tự bằng cách sử dụng Knox để tải xuống tệp bằng cách sử dụng mã này:Truy cập luồng tệp thô từ tệp tải lên có kích thước nút

knox.downloads.get(widget.download).on('response',function(sres){ 
    res.writeHead(200, { 
     'Content-Type':'application/zip', 
     'Content-Length': sres.headers['content-length'], 
     'Content-Disposition':'attachment; filename=' + widget.download 
    }); 
    util.pump(sres, res); 
}).end(); 

Bây giờ tôi muốn thực hiện điều gì đó tương tự theo hướng mờ (Tải tệp lên từ trình duyệt lên S3).

Cho đến nay tôi đã viết một event handler để chụp mỗi phần dữ liệu từ nội dung tập tin đang được tải lên:

var form = new formidable.IncomingForm(); 
form.onPart = function(part){ 
    if(!part.filename){ 
     form.handlePart(part); 
    }else{ 
     if(part.name == 'download'){ 
      // Upload to download bucket 
      controller.putDownload(part); 
     }else{ 
      // Upload to the image bucket 
      controller.putImage(part); 
     } 
     //res.send(sys.inspect(part)); 
    } 
} 
form.parse(req, function(err, fields, files){ 
    if(err){ 
     res.json(err); 
    }else{ 
     res.send(sys.inspect({fields:fields, files:files}), {'content-type':'text/plain'}); 
     //controller.createWidget(res,fields,files);    
    } 
}); 


controller.putDownload = function(part){ 
    part.addListener('data', function(buffer){ 
     knox.download.putStream(data,part.filename, function(err,s3res){ 
      if(err)throwError(err); 
      else{ 
       console.log(s3res); 
      } 
     }); 
    }) 
    knox.downloads.putStream(part, part.filename, function(err,s3res){ 

     if(err)throwError(err); 
     else{ 
      console.log(s3res); 
     } 
    }); 
} 

Nhưng trường hợp dữ liệu chỉ cho tôi bộ đệm. Vì vậy, nó có thể nắm bắt các dòng chính nó và đẩy nó vào S3?

Trả lời

17

Những gì bạn muốn làm là ghi đè lên Form.onPart phương pháp:

IncomingForm.prototype.onPart = function(part) { 
    // this method can be overwritten by the user 
    this.handlePart(part); 
}; 

hành vi mặc định Formidable là để viết phần vào một tập tin. Bạn không muốn điều đó. Bạn muốn xử lý các sự kiện 'part' để ghi vào bản tải xuống knox. Bắt đầu với điều này:

form.onPart = function(part) { 
    if (!part.filename) { 
     // let formidable handle all non-file parts 
     form.handlePart(part); 
     return; 
    } 

Sau đó mở yêu cầu knox và xử lý các sự kiện phần thô tự hỏi:

part.on('data', function(data) { 
    req.write(data); 
}); 
part.on('end', function() { 
    req.end(); 
}); 
part.on('error', function(err) { 
    // handle this too 
}); 

Như một phần thưởng, nếu sai req.write(data) trở lại có nghĩa là gửi đệm đầy. Bạn nên tạm dừng trình phân tích cú pháp Formidable. Khi bạn nhận được sự kiện drain từ luồng Knox, bạn nên tiếp tục Formidable.

-2

Không có cách nào để bạn nắm bắt luồng, vì dữ liệu phải được dịch bởi Formidable. Các buffer bạn đang đưa ra là nội dung tập tin trong khối của buffer.length: điều này có thể là một vấn đề bởi vì nhìn vào tài liệu của Formidable nó xuất hiện cho đến khi tập tin được tải lên hoàn toàn nó không thể báo cáo đáng tin cậy kích thước tập tin và phương pháp put Knox có thể cần .

Không bao giờ sử dụng Knox cách này trước đây, nhưng bạn có thể có một số may mắn với một cái gì đó như thế này:

controller.putDownload = function(part){ 
    var req = knox.download.put(part.filename, { 
     'Content-Type': 'text/plain' 
    }); 
    part.addListener('data', function(buffer){ 
    req.write(buffer); 
    }); 
    req.on('response', function(res){ 
     // error checking 
    }); 
    req.end(); 
} 

Một chút không chắc chắn về câu trả lời kiểm tra bit, nhưng .... xem nếu bạn có thể whip đó vào hình dạng. Ngoài ra, Streaming an octet stream from request to S3 with knox on node.js cũng có một ghi chú có thể hữu ích cho bạn.

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