2012-02-11 46 views
14

Trong ứng dụng node.js của tôi, tôi đang sử dụng gm (a graphicsmagick wrapper)aws2js (amazon cli wrapper). Vấn đề là Amazon cần phải biết chiều dài nội dung để tôi có thể đặt luồng trên S3.có độ dài nội dung của luồng

Tôi đang tải lên một hình ảnh để ứng dụng của tôi, đọc tập tin đó bằng cách tạo ra một dòng:

var fileStream=fs.createReadStream(file.path) 

tôi vượt qua file đó vào gm, thay đổi kích thước và sau đó nói với nó để dòng tập tin đó. Sau đó tôi muốn đặt luồng đó vào aws:

gm(fileStream, "some.png").        
    identify({bufferStream: true}, function(err, info) { 
     this.stream("png", function (err, stdout, stderr) { 
      if (err){console.log(err);cb(err);return;} 

      aws.S3.putStream(path, stdout, 'public-read', {'content-length': ?????, 'content-type': 'image/png'}, function (err, result) { 
      .....  
      } 
     }); 
    }); 
}); 

Vấn đề là Amazon cần phải biết chiều dài nội dung (không phải thư viện) để đặt luồng. AWS không hỗ trợ các luồng chunked.

Có ai biết cách tôi có thể xác định độ dài nội dung của luồng không? Hoặc sẽ là giải pháp duy nhất để tmp ghi nó vào đĩa, đọc các tập tin như một dòng và sau đó đặt nó vào amazon với chiều dài nội dung của tập tin tạm thời?

+0

Bạn đã bao giờ tìm ra điều này chưa? Tôi đang cố gắng làm chính xác điều tương tự ... – Bill

+1

Hóa đơn; Tôi đệm kết quả và nhận được kích thước của nó. Đáng buồn thay, không có cách nào khác để làm điều đó, bởi vì amazon cần phải biết kích thước và luồng là tốt - một dòng - không có chiều dài cố định. – japrescott

Trả lời

1

Tùy thuộc vào cách bạn đang tải lên. Tôi đang sử dụng express.js và tôi nhận được độ dài từ đối tượng req.files như req.files này. [Tên tệp đầu vào] .length.

Tôi thực sự đang cố thực hiện chính xác điều này nhưng tôi đang gặp sự cố khi aws2j nhận ra luồng. cho tôi biết nếu bạn làm cho nó hoạt động.

+0

mọi thứ hoạt động, nếu tôi trực tiếp đặt luồng (vì tôi đã có kích thước tệp thực, tôi vừa tải lên). Nhưng kể từ khi tôi thay đổi kích thước, các tập tin thay đổi kích cỡ sẽ có một chiều dài nội dung khác nhau, mà tôi cần phải dermin .. Tôi sẽ giữ cho bạn đăng .. – japrescott

+0

Ahh, tôi quên mất điều đó. Tôi cần phải làm điều tương tự. Và vì lý do nào đó tôi nhận được lỗi 400 từ S3. – jabbermonkey

+0

Tôi đoán bạn có thể đang sử dụng Trình phân tích cú pháp nội dung có diễn đạt, và đây là lý do tại sao bạn có sẵn một "req.files". Body Parser dưới mui xe sẽ thực sự lưu các tập tin đầu tiên (đây là lý do tại sao bạn có thể nhận được kích thước của tập tin), mà tôi tin là những gì OP đã cố gắng để tránh làm. Bạn đang mất lợi thế của đường ống trực tiếp đến S3. – schankam

2
gm(fileStream).filesize({bufferStream: true}, function (error, filesize) { 
    this.stream(function (error, stdout, stderr) { 
    aws.S3.putStream(path, stdout, 'public-read', {'content-length': filesize, 'content-type': 'image/png'}, function (error, result) { 
     // .....  
    }); 
    }); 
}); 
Các vấn đề liên quan