【已解决】Nodejs N-blog-master 开源项目中的问题-上传文件名

【已解决】Nodejs N-blog-master 开源项目中的问题-上传文件名

地址:https://github.com/nswbmw/N-blog 1.文件上传后的名字还是原始名字,通过后台输出,fs.renameSync 方法是有效的。但是为什么上传到服务器名字还是没变呢?求大神解惑。 index.js中的代码

app.post('/upload', checkLogin);
  app.post('/upload', function (req, res) {
  	var img='';
    for (var i in req.files) {
      if (req.files[i].size == 0){
        // 使用同步方式删除一个文件
        fs.unlinkSync(req.files[i].path);
        console.log('Successfully removed an empty file!');
      } else {
        var target_path = './public/images/' + req.files[i].name;
        // 使用同步方式重命名一个文件
        fs.renameSync(req.files[i].path, target_path);
         console.log('req.files[i].path'+req.files[i].path+',target_path:'+target_path);
        console.log('Successfully renamed a file!');
      }
    } 
    req.flash('success', '文件上传成功!');
    res.redirect('/upload');
  });
 \n```

后台输出的结果

GET /icon/hlw.jpeg 304 162ms
Successfully removed an empty file!
**req.files[i].path:public\images\13044-106kxba.jpg**
target_path:./public/images/4.jpg
Successfully renamed a file!
req.files[i].path:public\images\13044-r5fc9f.jpg
**target_path:./public/images/222.jpg**
Successfully renamed a file!
Successfully removed an empty file!
Successfully removed an empty file!
POST /upload 302 14ms - 70b

6 回复

【已解决】Nodejs N-blog-master 开源项目中的问题 - 上传文件名

问题描述

在使用 N-blog-master 这个开源项目时,我遇到了一个问题:文件上传后,服务器上保存的文件名仍然是原始文件名,而不是我期望的新文件名。尽管我在代码中使用了 fs.renameSync 方法来重命名文件,并且从后台输出的日志来看,该方法似乎已经执行成功。

问题分析

根据你提供的代码片段,fs.renameSync 方法确实被调用,并且日志也显示文件已经被重命名。然而,实际上传到服务器上的文件名并没有改变。这可能是由于以下几个原因:

  1. 路径问题:确保 target_path 的路径是正确的,并且目标目录存在。
  2. 权限问题:检查是否有足够的权限来修改文件名。
  3. 文件覆盖:如果目标文件已经存在,可能会导致覆盖或失败。

解决方案

我们可以通过以下步骤来解决问题:

  1. 确保目标目录存在并且有写权限。
  2. 检查文件是否已经存在,并决定是否覆盖。
  3. 使用异步版本的方法以避免可能的阻塞。

以下是改进后的代码示例:

const express = require('express');
const multer = require('multer');
const fs = require('fs');
const path = require('path');

const app = express();
const upload = multer({ dest: 'public/uploads/' });

app.post('/upload', checkLogin);

app.post('/upload', upload.array('files'), function (req, res) {
  const uploadDir = path.join(__dirname, 'public/images');

  req.files.forEach(file => {
    const originalPath = file.path;
    const newFileName = 'new_' + file.originalname; // 生成新的文件名
    const targetPath = path.join(uploadDir, newFileName);

    if (!fs.existsSync(uploadDir)) {
      fs.mkdirSync(uploadDir, { recursive: true }); // 创建目录(如果不存在)
    }

    if (fs.existsSync(targetPath)) {
      console.log(`File ${newFileName} already exists. Skipping.`);
    } else {
      fs.rename(originalPath, targetPath, (err) => {
        if (err) {
          console.error(`Error renaming file: ${err}`);
        } else {
          console.log(`Successfully renamed ${originalPath} to ${targetPath}`);
        }
      });
    }
  });

  req.flash('success', '文件上传成功!');
  res.redirect('/upload');
});

function checkLogin(req, res, next) {
  // 登录检查逻辑
  next();
}

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

关键点解释

  1. Multer 配置:使用 Multer 来处理文件上传,指定存储路径为 public/uploads/
  2. 路径处理:使用 path 模块来处理路径,确保目录存在并正确拼接文件路径。
  3. 文件重命名:使用 fs.rename 方法重命名文件,并在文件已存在时跳过重命名操作。

希望这些改进能够帮助你解决问题!如果还有其他疑问,请继续提问。


js\n fs.rename(req.files[i].path, target_path); \n 结果也是一样的

仔细想了应该是重命名文件没有生成。

最终测试,发现将两个参数对转过来。两个文件都生成了。但是报404错了

再测试,修改

        var target_path =req.files[i].path;
        // 使用同步方式重命名一个文件
        fs.renameSync(req.files[i].path, target_path);

获得了自己想要的结果,达到文件上传后不是原名字显示。 真是感慨啊,感觉还是有什么地方不对劲。暂时先不管了。

根据你的描述,你在处理文件上传时发现 fs.renameSync 方法没有按预期修改文件名。从你提供的日志来看,fs.renameSync 方法似乎工作正常,但文件名在服务器上可能没有改变。

首先,确认一下 req.files[i].pathtarget_path 是否正确,并且确保目标路径没有被其他代码覆盖或删除。此外,可以尝试以下几种方法来排查和解决问题:

  1. 检查文件路径的绝对路径与相对路径: 确保 target_path 的路径是正确的。可以尝试使用绝对路径进行重命名操作,而不是相对路径。
var path = require('path');

var target_path = path.join(__dirname, 'public/images/', '4.jpg'); // 使用绝对路径
  1. 添加错误处理: 在调用 fs.renameSync 时,捕获可能的错误,以便更好地理解问题所在。
try {
  fs.renameSync(req.files[i].path, target_path);
  console.log('Successfully renamed a file!');
} catch (error) {
  console.error('Failed to rename file:', error);
}
  1. 检查是否有其他逻辑覆盖了文件名: 确认没有其他逻辑(例如其他中间件、路由等)覆盖了文件名或进行了额外的文件处理。

以下是改进后的代码示例:

app.post('/upload', checkLogin, function (req, res) {
  var img = '';
  for (var i in req.files) {
    if (req.files[i].size == 0) {
      // 使用同步方式删除一个文件
      fs.unlinkSync(req.files[i].path);
      console.log('Successfully removed an empty file!');
    } else {
      var target_path = path.join(__dirname, 'public/images/', '4.jpg'); // 使用绝对路径
      try {
        fs.renameSync(req.files[i].path, target_path);
        console.log('Successfully renamed a file!');
      } catch (error) {
        console.error('Failed to rename file:', error);
      }
    }
  } 
  req.flash('success', '文件上传成功!');
  res.redirect('/upload');
});

通过这些改进,你可以更好地理解问题并定位具体原因。如果问题仍然存在,请检查服务器上的实际文件路径是否存在,或者是否有权限问题。

回到顶部