Nodejs图片上传不完整,请帮忙解决。

Nodejs图片上传不完整,请帮忙解决。

用的代码很简单:

 app.use(express.bodyParser({
uploadDir:__dirname + '/uploadfile/group/icon',
keepExtensions:true,
defer:true,  //enable event
limit:10000000
}));
app.disable("multipart");
app.post('/upload',function(req, res){//bind event handler

req.form.on('progress',function(bytesReceived, bytesExpected){
    console.log(((bytesReceived / bytesExpected)*100)+"% uploaded");});

    req.form.on('end',function(){
        console.log(req.files);
        res.send("done");});
});

但是上传后发现有的图片完整上传,有的不完整,对比如下:

enter image description here

而且奇怪的是bytesReceived竟然比bytesExpected还要大。。


6 回复

根据你的描述,你遇到的问题可能是由于文件上传过程中出现了一些异常导致文件没有完全上传。以下是一些可能的原因及解决方案:

  1. 检查文件大小限制:确保客户端发送的文件大小不超过服务器端设置的最大文件大小限制。

  2. 使用正确的中间件express.bodyParser 已经被废弃了,建议使用 multer 这样的中间件来处理文件上传。

  3. 处理错误:确保在文件上传过程中能够捕获并处理任何可能出现的错误。

以下是一个使用 multer 的示例代码,可以帮助你更好地处理文件上传问题:

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

// 配置 Multer 存储引擎
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './uploadfile/group/icon'); // 设置上传文件的保存路径
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now() + '.' + file.originalname.split('.').pop()); // 设置文件名
  }
});

const upload = multer({ storage });

const app = express();

app.post('/upload', upload.single('image'), function (req, res) {
  if (!req.file) {
    return res.status(400).send('No file uploaded.');
  }

  console.log(req.file);
  res.send('File uploaded successfully!');
});

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

解释

  1. Multer 中间件配置

    • storage 定义了文件存储的方式,包括保存路径和文件名。
    • upload.single('image') 表示处理单个文件上传,并将文件字段命名为 image
  2. 处理文件上传请求

    • req.file 包含上传文件的信息,如文件名、大小等。
    • 如果没有文件上传,则返回 400 状态码并提示 “No file uploaded.”
  3. 错误处理

    • 通过检查 req.file 是否存在来确保文件已成功上传。

注意事项

  • 确保客户端发送的文件字段名与服务器端配置一致(例如这里的 image)。
  • 使用 multer 可以更好地管理文件上传过程中的各种情况,包括文件大小限制、错误处理等。

希望这些信息能帮助你解决问题!


知道了,是app.disable(“multipart”);这里的问题,去掉就正常了,具体原因得再看看了

好东西啊

从你的描述来看,问题可能出在 expressformidable 的使用上。你提到的代码片段中使用了 express.bodyParser(),但该方法在较新版本的 Express 中已经被移除。你可以考虑使用 multer 或者 busboy 这样的中间件来处理文件上传。

示例代码:使用 multer 处理图片上传

  1. 安装 multer

    npm install multer --save
    
  2. 修改你的代码:

    const express = require('express');
    const multer = require('multer');
    
    const app = express();
    
    // 配置存储引擎
    const storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, __dirname + '/uploadfile/group/icon');
        },
        filename: function (req, file, cb) {
            cb(null, file.fieldname + '-' + Date.now());
        }
    });
    
    const upload = multer({ storage: storage });
    
    // 设置路由
    app.post('/upload', upload.single('image'), function (req, res) {
        console.log(req.file);
        res.send("Image uploaded successfully!");
    });
    
    app.listen(3000, () => {
        console.log('Server is running on port 3000');
    });
    

解释

  • Multer 是一个专门用于处理 multipart/form-data 的 Node.js 中间件,适用于文件上传。
  • 在上面的代码中,我们配置了一个存储引擎(storage),并指定了文件保存的位置和文件名格式。
  • 使用 upload.single('image') 来处理单个文件上传。如果需要处理多个文件,可以使用 upload.array('images', 12) 或其他相应的方法。
  • 在处理请求时,可以通过 req.file 访问上传的文件信息,包括文件路径、原始文件名等。

通过这种方式,可以更可靠地处理文件上传,避免由于 express.bodyParser 被弃用导致的问题。

回到顶部