错误:ENOENT:没有这样的文件或目录,在heroku上重命名

时间:2019-03-19 07:02:31

标签: javascript node.js heroku

我刚刚将我的第一个nodejs应用程序部署到了heroku,其中包含文件上传选项,当我检查heroku日志时,它在我的本地主机上运行良好,但是在heroku上却不能运行,错误消息:ENOENT:无此类文件或目录,重命名为'/ tmp / upload_b7273eba4e1532df2526c225f550de61'->'/app/routes./uploads/data/1f86e8b13b3e0f95c8ef4d61f8d515ad.pdf'

我的代码看起来像这样

routes.post('/',(req,res) => {
var form=new formidable.IncomingForm();
form.parse(req,(err,fields,files) => {
    //Check file type
    console.log(files.resume.type);
    if(files.resume.type !== 'image/jpeg' && files.resume.type !== 'application/pdf' && files.resume.type !== 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' && files.resume.type !== 'application/msword'){
        res.render('upload',{msg:"Resume must be in jpg,doc,docx,pdf format"})
    }else{
    //If in resume format
        crypto.randomBytes(16,(err,buf) => {
            if(err) { return err}
            const filename = buf.toString('hex') + path.extname(files.resume.name);        
            var old_path=files.resume.path;
            console.log(old_path);

            var new_path=path.join(__dirname+'./uploads/data/' + filename);
            console.log(new_path);

            fs.rename(old_path,new_path,(err) => {
                if(err) throw err;
                console.log("File Uploaded");
            res.render('upload',{msg:"Upload success"})      
            })

        });  
    }

})


});

我在heroku上的old_path是/ tmp / upload_b7273eba4e1532df2526c225f550de61和new_path是/app/routes./uploads/data/1f86e8b13b3e0f95c8ef4d61f8d515ad.pdf

1 个答案:

答案 0 :(得分:1)

TL;DR:

在使用 form.uploadDir 之前,将 form.parse() 等于您上传的所需着陆点。

说明

我最近遇到了同样的问题,所以我决定发布我的发现来帮助其他人。

正如 Neil Lunn 指出的那样,需要将上传目录设置为强大。默认值为 os.tempDir()。在 Windows 上,这通常类似于: C:\Users\ADMINI~1\AppData\Local\Temp\2\

由于此位置并不总是默认存在,因此会引发错误。您只需要为强大的上传设置一个着陆位置,并且必须在 parse() 表单之前完成。例如:

let form = new formidable.IncomingForm();
form.uploadDir = path.join(__dirname, "uploads");
form.parse(req, async function (err, fields, files) {...

这会将您的登录点设置为与名为 uploads/ 的 server.js 或 App.js 文件相同位置的目录。

然后您可以重命名您上传的文件的路径以匹配该位置并在那里访问它们。例如:

fs.renameSync(files.file.path, "uploads/" + fields.fileName);

然后你可以访问你的文件

fs.readFileSync("uploads/" + fields.fileName);