Ze względu na niezawodność przenoszę niektóre obrazy z zewnętrznego źródła do pamięci Amazon S3.

Jednak obrazy są obcięte i wyglądają jak na poniższym obrazku.
Kod, którego używam, ma następującą logikę:

const request = require('request');
let r = request(pictureUrl);
r.on('response', function(rs){
  let newFileName = new Date().getTime() + '_' + externalId+'.jpg';
  let localPath = __dirname+'/../../temp_files/'+newFileName+'';
  let ws = fs.createWriteStream(localPath);
  rs.pipe(ws);
  rs.on('end', function(){
    fs.readFile(localPath, (error, fileContent) => {
      uploadToS3(fileContent, newFileName, 'profile_pics', function (err, response) {
        fs.unlink(localPath, (err) => {

           /* send response to browser */

Uważam, że przyczyną tego jest jeden z następujących:
1. r.on('response' <- plik nie został jeszcze odebrany i rozpoczynają się kolejne procesy.
2. rs.on('end' <- plik nie jest jeszcze zapisany lokalnie i rozpoczynają się kolejne procesy.
3. fs.unlink(localPath <- jest wykonywane przed zakończeniem uploadToS3(fileContent.

Opinie?

'Incomplete image copy'

1
George I. 1 listopad 2018, 11:47

1 odpowiedź

Najlepsza odpowiedź

Powinieneś przesłać plik do S3 w wywołaniu zwrotnym zdarzenia finish strumienia z możliwością zapisu .

ws.on('finish', function(){
    fs.readFile(localPath, (error, fileContent) => {
      uploadToS3(fileContent, newFileName, 'profile_pics', function (err, response) {
...

Masz rację co do założenia nr 2

  1. rs.on('end' <- plik nie jest jeszcze zapisany lokalnie i rozpoczynają się kolejne procesy.

Inne założenia są błędne.

  1. r.on('response' <- plik nie został jeszcze odebrany i rozpoczynają się kolejne procesy.

#1 nie ma znaczenia. Wiele wywołań zwrotnych powinno być w stanie działać równolegle.

  1. fs.unlink(localPath <- jest wykonywane przed uploadToS3(fileContent jest zakończone.

#3 jest prawdopodobnie błędne. Nie jestem pewien, co robi uploadToS3, ale prawdopodobnie wywołuje wywołanie zwrotne po zakończeniu przesyłania, więc plik jest unlinked po tym

1
mihai 3 listopad 2018, 00:34