2012-08-01 18 views
5

Tôi đang sử dụng Express.js và có lộ trình tải lên hình ảnh mà sau đó tôi cần phải đổi kích thước. Hiện tại tôi chỉ để Express ghi tệp vào đĩa (mà tôi nghĩ sử dụng node-formidable dưới bìa) và sau đó thay đổi kích thước bằng cách sử dụng gm (http://aheckmann.github.com/gm/) viết phiên bản thứ hai vào đĩa.Tệp luồng được tải lên bằng Express.js đến gm để loại bỏ ghi hai lần

gm(path) 
    .resize(540,404) 
    .write(dest, function (err) { ... }); 

Tôi đã đọc mà bạn có thể có được một tổ chức của các dòng node-formidable tập tin trước khi nó viết nó vào đĩa, và kể từ gm có thể chấp nhận một dòng thay vì chỉ một con đường, tôi sẽ có thể vượt qua quyền này thông qua loại bỏ ghi đôi vào đĩa.

Tôi nghĩ tôi cần phải ghi đè form.onPart nhưng tôi không chắc chắn nơi (nó nên được thực hiện như Express middleware?) Và tôi không chắc chắn làm thế nào để có được một tổ chức của form hoặc những gì chính xác để làm với part. Đây là bộ xương mã mà tôi đã thấy ở một vài nơi:

form.onPart = function(part) { 
    if (!part.filename) { form.handlePart(part); return; } 

    part.on('data', function(buffer) { 

    }); 
    part.on('end', function() { 

    } 
} 

Ai đó có thể giúp tôi đặt hai phần này lại với nhau? Cảm ơn!

Trả lời

7

Bạn đang đi đúng hướng bằng cách viết lại form.onPart. Formidable ghi vào đĩa theo mặc định, vì vậy bạn muốn hành động trước khi nó.

Các phần chính là Luồng, vì vậy bạn có thể đưa chúng vào bất kỳ điều gì bạn muốn, bao gồm gm. Tôi đã không kiểm tra nó, nhưng điều này có ý nghĩa dựa trên các tài liệu:

var form = new formidable.IncomingForm; 
form.onPart = function (part) { 
    if (!part.filename) return this.handlePart(part); 

    gm(part).resize(200, 200).stream(function (err, stdout, stderr) { 
    stdout.pipe(fs.createWriteStream('my/new/path/to/img.png')); 
    }); 
}; 

Đối với các trung gian, tôi muốn copypaste các multipart middleware từ Connect/Express và thêm chức năng onPart với nó:

Sẽ đẹp hơn nếu formidable không ghi vào đĩa theo mặc định hoặc nếu nó lấy cờ, phải không? Bạn có thể gửi cho họ một vấn đề.

+0

Cảm ơn bạn! Điều này đã cho tôi 95% con đường ở đó. Vấn đề cuối cùng của tôi là 'gm' là không đồng bộ và do đó việc phân tích biểu mẫu trả về trước khi thay đổi kích thước thực sự hoàn thành (có nghĩa là url mà tôi đã quay lại máy khách chưa tốt). Có cách nào để cho 'ghê gớm' biết khi xử lý 'phần' thực sự hoàn thành? – Bill

+0

Thực ra, tôi mới kết thúc việc xử lý điều này trên máy khách - thay vào đó hoạt động tốt hơn theo cách đó. Cảm ơn một lần nữa! – Bill

+1

stdout là một luồng. Đó là lý do tại sao bạn có thể pipe() nó vào một file WriteStream. Và điều đó có nghĩa là nó có một sự kiện "kết thúc" mà bạn có thể nghe. Chỉ cần làm stdout.on ('end', fn) và đó là khi bạn có thể nói cho khách hàng biết công việc đã hoàn thành. – juandopazo

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