Как правильно обрабатывать загрузку файлов с помощью 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 без использования промежуточного хранилища.