Сохраненное изображение недоступно. Как будто запрос разрешается до его завершения

Пользователь выбирает изображение (в данном случае из Facebook, но я не думаю, что это имеет отношение к проблеме). Запрос отправляется на сервер, чтобы получить изображение и сохранить его локально. Запрос обрабатывается с помощью 200. Разрешенный запрос принимается на клиенте, и изображение динамически добавляется на страницу с помощью JS путем создания нового образа.

Проблема: несмотря на то, что запрос не разрешается до тех пор, пока не завершится процесс записи, когда клиент пытается загрузить изображение, он возвращает 404.

Я попытался добавить обработчик ошибок на клиенте, который перезагружает изображение, если оно возвращается с 404. Это работает через несколько сотен миллисекунд. Однако есть еще одна проблема. Часто изображение загружено только наполовину, а остальное - черное.

Как будто изображение не завершило обработку, когда запрос разрешается.

Я понятия не имею, что является причиной проблемы. Я не вижу, как запрос может быть обработан до завершения операции.

import fs from 'fs';
import request from 'request';
import gm from 'gm';
import createUserImageFolders from './imageHelpers/createUserImageFolders';
import getNextImageNumber from './imageHelpers/getNextImageNumber';
import saveImages from './imageHelpers/saveImages';

export default function uploadFacebookPhoto(req, params) {
  return new Promise((resolve, reject) => {
    createUserImageFolders(req.session.currentDesignerSessionId);

    const userDir = 'static/images/user/' + req.session.currentDesignerSessionId;

    const imageNumber = getNextImageNumber(userDir + '/uploads/full');

    const filename = `${userDir}/uploads/full/${imageNumber}.jpg`;

    const thumbWidth = 100;

    // Stream the image from the remote server.
    request.head(req.body.photoUrl, (err, response, body) => {
      request(req.body.photoUrl).pipe(fs.createWriteStream(filename).on(
        'close',
        () => {

          // Create thumbnail
          gm(filename)
            .noProfile()
            .quality(85)
            .resize(thumbWidth)
            .write(userDir + `/uploads/thumb/${imageNumber}.jpg`, (error) => {
              if (error) {
                console.error('Graphics Magic (gm) error ', error);
                reject({error: 500});
              } else {
                resolve(true);
              }
            });

        }
      ));
    });
  });
}

0 ответов

Другие вопросы по тегам