Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js express文件上载错误和几个问题_Node.js_Express - Fatal编程技术网

Node.js express文件上载错误和几个问题

Node.js express文件上载错误和几个问题,node.js,express,Node.js,Express,我使用多方处理文件上传 在我的控制器中,我有 exports.uploadFile = function(req, res, next) { if (req.files && req.files.file) { var file = req.files.file var tmpPath = file.path var targetDirectory = dir.public + '/upload' var

我使用多方处理文件上传

在我的控制器中,我有

exports.uploadFile = function(req, res, next) {

    if (req.files && req.files.file) {
        var file = req.files.file
        var tmpPath = file.path
        var targetDirectory = dir.public + '/upload'
        var targetPath = dir.public + '/upload' + '/' + file.name

        if (file.size > config.uploadFileMaxSize) {
            fs.unlink(tmpPath, function(err) {
                if (err)
                    return next(err)
                return next(helper.getAbuseError('file is too large'))
            })
        }
        else {
            fs.mkdir(targetDirectory, function(err) {
                if (err && err.code !== 'EEXIST')
                    return next(err)
                fs.rename(tmpPath, targetPath, function(err) {
                    if (err)
                        return next(err)
                    fs.unlink(tmpPath, function(err) {
                        if (err)
                            return next(err)
                        return res.json(helper.dataAppendedWithMessage({path: targetPath}, 'success', 'file uploaded'))
                    })
                })
            })
        }

    }
}
在我的路由器中:

restRouter.post(helper.serverUrl.common.uploadFile,
    helper.permission.middleware(helper.accessList.uploadFile),
    multiparty(), //Note: only used in file uploads
    commonController.uploadFile)
有几个问题

  • 无法访问mkdir。错误在取消链接时中断

    Enoint,取消链接“/var/folders/5p/qqz2vyhd3yqb_334h6fj7_y0000gq/T/O3BTOo3rXdKRT3Zfs5JPUpn8.png”

  • 为什么上面的tmpPath在
    /var/folders
    下?从我阅读的所有教程中,它应该存储在
    [app\u root]/tmp

  • 除了检查文件大小,我如何只允许图像、音频和视频?我需要支持所有可以嵌入和标记的类型,并拒绝所有其他类型。我知道有一个
    文件。键入
    值,但我不想硬编码它。如何检查HTML5标记中是否可以使用文件类型

  • 在我的成功回调中,我返回
    {path:targetPath}
    供客户机标记使用。但是目标路径是
    /path/to/app\u root/public/upload/xxx.png
    ,我怎么能只发回
    /public/upload/xxx.png
    ?我当然可以搜索
    public
    并去掉
    /path/to/app\u root/
    ,但代码会变得很乱。还有其他优雅的方法吗

  • 是否可以提前拒绝大文件?只有在文件存储在
    /tmp
    后才会调用此函数,攻击者只需上传一个1000GB的文件,就可以轻易地将我的存储空间淹没


  • 我给你一个功能可能是这可以帮助你上传文件,虽然我做了图像上传,但很少修改,这可能也为你工作

        handleFileUpload: function(req) {
    
                if(!req.files || !req.files.place_img || !req.files.place_img.name) {
                    return req.body.currentPicture || '';
                }
                var data = fs.readFileSync(req.files.place_img.path);
                var fileName = req.files.place_img.name;
                var uid = crypto.randomBytes(10).toString('hex');
                var dir = __dirname +"/../public/uploads/" + uid;
                fs.mkdirSync(dir, '0777');
                fs.writeFileSync(dir + "/" + fileName, data);
                return '/uploads/' + uid + "/" + fileName;
    }
    

    以下是几个答案:

  • fs.rename()
    将文件从a重命名为B,它不会复制文件。因此,成功重命名后,路径a不再存在,因此您不能(/不必)取消链接
  • 不知道为什么会这样
    /var/folders/XXX/YYY/T
    包含“每个用户临时文件和缓存”(请参见
    $man-hier
    ),但多方使用
    os.tmpDir()
    ,它至少在我的Mac上返回
    /tmp
    (如预期的那样)
  • 简而言之:你不能,除非你能找到一个模块来提供这些类型,我怀疑它是否存在。不过,您可以根据
    图像/*
    视频/*
    音频/*
    检查内容类型
  • 我认为您仍然需要手动执行此操作:

    var filePath   = '/upload/' + file.name;
    var targetPath = dir.public + filePath;
    ...
    res.json({ path: filePath });
    

  • 传递给
    连接多方
    的任何选项都将传递给引擎盖下的
    多方
    ,该引擎盖具有选项。这会将所有文件的上传限制在一定的范围内,但是如果你只上传一个文件,它也应该可以工作
    为什么要使用readFileSync?在这种情况下,您需要捕获异常吗?我看不出我们的代码之间有任何区别,除了它在我的mac上返回的asyncon
    /var/folders
    。是mac配置还是express配置?我没有使用
    节点多方
    。我正在使用
    连接多方
    。此外,在用户将文件上载到
    /tmp
    后,将调用多方中间件。如何在中间件内部防止这种情况发生?
    connectmultiparty
    使用
    节点multiparty
    ,并负责文件上传处理。至于临时目录:您是使用官方的Node.js还是使用自制软件安装的?也许区别就在于此。我使用自制软件安装it@OMGPOP这可能与此有关。如果确实要使用
    /tmp
    ,请设置该选项。