首页 > 解决方案 > Express-fileupload 无法上传大尺寸文件

问题描述

现在,我正在尝试上传一个大文件(2.75GB)。当我尝试上传大文件时,NodeJS 服务器死机并给我以下错误。可以上传其他小文件。OTL

node[38948]: ../src/node_file.cc:1833:void node::fs::WriteBuffer(const FunctionCallbackInfo<v8::Value> &): Assertion `args[3]->IsInt32()' failed.
 1: 0x10009ce91 node::Abort() [/usr/local/bin/node]
 2: 0x10009cd1a node::AppendExceptionLine(node::Environment*, v8::Local<v8::Value>, v8::Local<v8::Message>, node::ErrorHandlingMode) [/usr/local/bin/node]
 3: 0x1000ac108 node::fs::WriteBuffer(v8::FunctionCallbackInfo<v8::Value> const&) [/usr/local/bin/node]
 4: 0x10021da46 v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo) [/usr/local/bin/node]
 5: 0x10021d0c9 v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::FunctionTemplateInfo>, v8::internal::Handle<v8::internal::Object>, v8::internal::BuiltinArguments) [/usr/local/bin/node]
 6: 0x10021c8b0 v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments, v8::internal::Isolate*) [/usr/local/bin/node]
 7: 0x1007fd979 Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit [/usr/local/bin/node]
 8: 0x100796ae2 Builtins_InterpreterEntryTrampoline [/usr/local/bin/node]

设置

// package.json
...

  "scripts": {
    "start": "node --max-old-space-size=4096 ./bin/www"
  },
...

// app.js

const fileUpload = require('express-fileupload');
app.use(fileUpload());


// upload.js
const session = await mongoose.startSession();
session.startTransaction();
try {
    const result = await Storage.create([attachment], {session: session});
    await req.files.newFile.mv(attachment.filePath);
    await session.commitTransaction();
    return res.send(result[0]);
} catch (err) {
    const message = "Can't save the attachment.";
    console.error(message, err);
    await session.abortTransaction();
    return res.status(500).send(message);
} finally {
    session.endSession();
}

标签: node.jsexpress

解决方案


如 express-fileup 中所述,您可以添加限制。

app.use(fileUpload({
  limits: { fileSize: 50 * 1024 * 1024 },
}));

对于文档中建议的大文件,使用临时文件而不是内存来管理上传过程。

// Note that this option available for versions 1.0.0 and newer. 
app.use(fileUpload({
    useTempFiles : true,
    tempFileDir : '/tmp/'
}));

您可以阅读那里的文档以获取更多详细信息


推荐阅读