Как правильно обрабатывать загрузку файлов с помощью Node.js Express backend?

Я решил использовать ng-flow Угловая реализация flow.js на переднем конце для обработки загрузки файлов, я тогда выбрал multer в качестве промежуточного программного обеспечения для получения файлов.

Я сделал самую простую установку промежуточного программного обеспечения для multer:

app.use(multer({ dest: './temp_uploads/'}))

Получил /POST upload маршрут, и я теперь регистрирую в консоли то, что получено:

app.route('/upload').post(function(request,response,next){

    console.log(request.body)
    console.log(request.files)
    // Response code and stuff then ...
});

Итак, выходы:

{ flowChunkNumber: '1',
  flowChunkSize: '1048576',
  flowCurrentChunkSize: '1606857',
  flowTotalSize: '1606857',
  flowIdentifier: '1606857-IMG_20140807_153553jpg',
  flowFilename: 'IMG_20140807_153553.jpg',
  flowRelativePath: 'IMG_20140807_153553.jpg',
  flowTotalChunks: '1' }
{ file: 
   { fieldname: 'file',
     originalname: 'blob',
     name: 'c12d6f8d4950e48eee21b43f8ee4344a',
     encoding: '7bit',
     mimetype: 'application/octet-stream',
     path: 'temp_uploads/c12d6f8d4950e48eee21b43f8ee4344a',
     extension: '',
     size: 1606857,
     truncated: false,
     buffer: null }}

На самом деле все сохраняется на моем сервере, под /temp_uploads как и должно быть. Но файлы не сохранят свои имена и даже расширение. Интересно, что мне следует сделать, чтобы все это хорошо настроить и даже предотвратить проблемы на моем сервере.

На всякий случай, я объясню, что я хочу сделать с файлами. После получения я сохраню их в Google Cloud Storage Platform. Затем я отправлю эти файлы в виде вложений, если размер файлов превышает 15 МБ, я добавлю ссылку для загрузки по почте.

В flow.js На сайте они показывают этот фрагмент PHP для обработки файлов на сервере, но, поскольку у меня плохой фон PHP, перевод кода не такой надежный вариант для меня:

$config = new \Flow\Config();
$config->setTempDir('./chunks_temp_folder');
$file = new \Flow\File($config);

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if ($file->checkChunk()) {
        header("HTTP/1.1 200 Ok");
    } else {
        header("HTTP/1.1 404 Not Found");
        return ;
    }
} else {
  if ($file->validateChunk()) {
      $file->saveChunk();
  } else {
      // error, invalid chunk upload request, retry
      header("HTTP/1.1 400 Bad Request");
      return ;
  }
}
if ($file->validateFile() && $file->save('./final_file_name')) {
    // File upload was completed
} else {
    // This is not a final chunk, continue to upload
}

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

1 ответ

На самом деле все сохраняется на моем сервере, в /temp_uploads, как и предполагалось. Но файлы не сохранят свои имена и даже расширение. Интересно, что мне следует сделать, чтобы все это хорошо настроить и даже предотвратить проблемы на моем сервере.

Вы можете получить контроль над именованием, следуя примеру на RETERME.md. Я включил это ниже:

app.use(multer({
    dest: './uploads/',
    rename: function (fieldname, filename) {
        return filename.replace(/\W+/g, '-').toLowerCase() + Date.now()
    }
}))

Похоже, есть много других крючков.

Смотрите также модуль облачного хранилища. Вы можете использовать это, чтобы отправить данные в Google.

abstract-blob-store и https://github.com/maxogden/google-cloud-storage, построенные поверх этого, были бы еще более подходящими. Это позволит вам передавать файлы напрямую в Google без использования промежуточного хранилища.

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