Używam Express.js
i mam trasę do przesyłania zdjęć, które muszę zmienić. Obecnie po prostu pozwalam Express
zapisywać plik na dysku (który, jak myślę, używa node-formidable
pod okładkami), a następnie zmienić rozmiar, używając gm
(http://aheckmann.github.com/gm/), który zapisuje drugą wersję na dysku.Plik strumieniowy przesłany za pomocą Express.js przez gm, aby wyeliminować podwójne pisanie
gm(path)
.resize(540,404)
.write(dest, function (err) { ... });
Czytałem, że można dorwać strumienia node-formidable
plików przed zapisuje go na dysku, a od gm
może zaakceptować strumień zamiast tylko ścieżki, powinienem być w stanie przekazać tego prawa poprzez wyeliminowanie podwójnego zapisu na dysk.
Chyba trzeba zastąpić form.onPart
ale nie jestem pewien, gdzie (powinno to być zrobione jak Express
middleware?) I nie jestem pewien, jak się trzymać z form
czy co dokładnie zrobić z part
. To jest szkielet kodu, który widziałem w kilku miejscach:
form.onPart = function(part) {
if (!part.filename) { form.handlePart(part); return; }
part.on('data', function(buffer) {
});
part.on('end', function() {
}
}
Czy ktoś może mi pomóc złożyć te dwa kawałki razem? Dzięki!
Dziękujemy! Dało mi to 95% drogi. Mój ostatni problem polega na tym, że 'gm' jest asynchroniczne, a więc parsowanie formularzy powraca przed faktycznym zakończeniem zmiany rozmiaru (co oznacza, że adres URL, który miałem z powrotem do klienta, nie jest jeszcze dobry). Czy istnieje sposób na poinformowanie 'strasznego ', gdy obsługa' part' jest rzeczywiście zakończona? – Bill
Właściwie to właśnie skończyłem obsługę tego na kliencie - działa lepiej w ten sposób. Dzięki jeszcze raz! – Bill
stdout jest strumieniem. Dlatego możesz potokować() do pliku WriteStream. A to oznacza, że ma "końcowe" wydarzenie, którego możesz słuchać. Po prostu wykonaj stdout.on ('end', fn) i wtedy możesz powiedzieć klientowi, że zadanie zostało wykonane. – juandopazo