返回顶部
首页 > 资讯 > 前端开发 > JavaScript >express+multer上传图片打开乱码问题及解决
  • 549
分享到

express+multer上传图片打开乱码问题及解决

2024-04-02 19:04:59 549人浏览 泡泡鱼
摘要

目录express+multer上传图片打开乱码原因解决方法简单的node文件上传下载及中文乱码1. 基于MEAN的技术栈2. 在前端代码中放置文件上传按钮和处理表单数据3. 后端接

express+multer上传图片打开乱码

原因

由于使用multer处理上传图片时,multer存储的是重命名的文件,文件并没有后缀名导致文件无法在服务器直接打开,手动加上后缀名就能打开文件。

如:

multer文件乱码问题

解决方法

引入fs模块将文件重命名存储即可,以下用单文件上传为例:

const fs=require('fs')
router.post('/imageUpload',upload.single('avatar'),function (req, res) {
    console.log(req.file)
    //获取文件后缀名
    var appendName=req.file.originalname.split('.')[1]
    //fs重命名文件,第一个参数为上传文件绝对路径,第二个参数为相对路径
    //第三个参数可选
    fs.rename(req.file.path,`tmp/uploads/${req.file.filename}.${appendName}`,function (err) {
        if (err) throw err
    })
    res.JSON({msg:'success'})
})

简单的node文件上传下载及中文乱码

1. 基于MEAN的技术栈

使用restful风格的接口

2. 在前端代码中放置文件上传按钮和处理表单数据

<div class="upload-file btn btn-sm btn-primary mb-2">
  <span><i class="fa fa-upload"></i> Upload</span>
  <input type="file" class="btn btn-sm btn-primary mb-2" (change)="fileChange($event, topic)" placeholder="Upload file" accept=".csv,.xls">
</div>

处理上传文件,生成表单数据 

fileChange(event, topic) {
  this.topic = topic;
  const fileList: FileList = event.target.files;
  const file: File = fileList[0];
  const fORMData: FormData = new FormData();
  formData.append('_id', topic._id);
  formData.append('file', file, file.name);
  this.topicService.uploadMark(formData).subscribe((res) => {
    this.topic.marks = res;
    this.toast.setMessage('item import successfully.', 'success');
  }, error => console.log(error));
}
uploadMark(fileData: FormData): Observable<any> {
  return this.Http.post('/api/upload', fileData);
}

3. 后端接收上传文件

文件上传的router

export default function setRoutes(app) {
  const router = express.Router();
// file uplaod
router.route('/upload').post(uploadCtrl.uploadFile);
// Apply the routes to our application with the prefix /api
app.use('/api', router);
}

在路由中,req的file字段是获取不到上传文件的,或许可以通过设置bodyParser来处理,但我这里使用一个比较常见的库multer。

npm install multer --save
import * as path from 'path';
import * as multer from 'multer';
import TopicService from '../services/topic';
export default class UploadCtrl {
  uploadFile = (req, res) => {
    const topicService = new TopicService();
    // 获取上传文件
    const uploading = multer({
      dest: path.join(__dirname, '../public/uploads'),
    }).single('file'); // 这里的file是formData.append('file', file, file.name)里的名称
    uploading(req, res, (err) => {
      if (err) {
        return console.error(err);
      }
      const topicId = req.body._id;
      const uploadFile = req.file;
      // 保存数据
      const save = async () => {
        const markList = await topicService.parseMark(uploadFile.path);
        const db = await topicService.saveDB(topicId, markList);
        return {
          markList: markList,
          db: db,
        };
      };
      save().then((result) => {
        res.status(200).json(result.markList);
      }, error => {
        console.error(error);
      });
    });
  }
}

4. 处理上传文件的乱码

上传的文件是一个中文的csv,解析时出现了乱码,使用iconv-lite进行转换

npm install iconv-lite --save
import * as iconv from 'iconv-lite';
import * as Buffer from 'bufferhelper';
export default class IconvHelper {
  
  static iconv2utf8 = (fileStr) => {
    return iconv.decode(fileStr, 'gbk');
  }
  
  static iconv2gbk = (fileStr) => {
    return iconv.encode(fileStr, 'gbk');
  }
}

bufferhelper是一个buffer的增强类,但这里使用后并不能正确赋值,所以这里暂且没有使用

对csv文件进行解析,生成数组,下一步可以保存到数据库

parseMark = (filePath) => {
  return new Promise((resolve, reject) => {
    // 读取文件内容
    fs.readFile(filePath, (error, data) => {
      if (error) {
        return reject(error);
      }
      const text = IconvHelper.iconv2utf8(data);
      const markList = [];
      // 将文件按行拆成数组
      text.split(/\r?\n/).forEach((line, index) => {
        const arr = line.split(',');
        if (index > 0 && arr[0]) {
          markList.push({
            userId: arr[0],
            username: arr[1],
            donePageCount: arr[2],
            areaCount: arr[4],
            name: arr[6],
          });
        }
      });
      resolve(markList);
    });
  });
}

5. 下载文件

res.setHeader('Content-disposition', `attachment; filename='${result.name}-member.csv'`);
res.setHeader('Content-type', 'text/csv; charset=GBK');
res.end(IconvHelper.iconv2gbk(content));

6. 处理下载文件的乱码

由于node.js只支持'ascii', 'utf8', 'base64', 'binary'的编码方式,不支持MS的utf8 + BOM格式,网上有说增加BOM头,如下示:

const msexcelBuffer = Buffer.concat([
  new Buffer('\xEF\xBB\xBF', 'binary'),
  new Buffer(IconvHelper.iconv2gbk(content))
]);

但实际并没有起作用,最后只是简单的encode成gbk问题得到解决

res.end(IconvHelper.iconv2gbk(content));

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: express+multer上传图片打开乱码问题及解决

本文链接: https://lsjlt.com/news/166910.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • express+multer上传图片打开乱码问题及解决
    目录express+multer上传图片打开乱码原因解决方法简单的node文件上传下载及中文乱码1. 基于MEAN的技术栈2. 在前端代码中放置文件上传按钮和处理表单数据3. 后端接...
    99+
    2024-04-02
  • Graphics2D 写图片中文乱码问题及解决
    目录Graphics2D 写图片中文乱码概述问题原因&解决Graphics2D 显示文字时乱码Graphics2D 写图片中文乱码 概述 由于工作的需求,需要往图片写字,写中...
    99+
    2024-04-02
  • Graphics2D中写图片中文乱码问题及解决方法
    这篇文章将为大家详细讲解有关Graphics2D中写图片中文乱码问题及解决方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Graphics2D 写图片中文乱码概述由于工作的需求,需要往图片...
    99+
    2023-06-25
  • Discuz上传图片失败问题排查及解决方法
    标题:Discuz上传图片失败问题排查及解决方法 在使用Discuz论坛系统中,用户常常会遇到上传图片失败的情况,这给用户和管理员带来了不便。本文将针对Discuz上传图片失败的问题进...
    99+
    2024-03-10
    图片上传 排查解决 discuz
  • 分析和解决forum.php打开时乱码问题
    在使用论坛系统时,我们有时会遇到一些问题,其中之一就是打开forum.php页面时出现乱码的情况。这种问题通常是由于网站编码格式不正确或者服务器端配置问题导致的。本文将从这两个方面为大家解决这个问题。一、网站编码格式不正确网站编码格式通常分...
    99+
    2023-05-14
  • 诊断与解决php无法图片上传问题
    PHP 是一种服务器端脚本语言,它具有上传文件功能,可用于实现在网站上上传图片等文件。但在实践中,有时会遭遇无法上传图片的情况。此时,应从以下几个方面进行诊断与解决。PHP 环境配置问题在实现文件上传功能前,必须确认 PHP 环境已经正确配...
    99+
    2023-05-14
  • tomcat以及idea乱码问题解决
    本文针对tomca部署到idea出现乱码问题提供解决方法,主要包括:运行tomcat时cmd命令框乱码,运行tomcat时控制台乱码,运行tomcat日志乱码,响应中文乱码,页面请求乱码的解决。 一、运行Tomcat命令框乱码问题以及ide...
    99+
    2023-09-08
    java tomcat
  • Cacti RRDTOOL中文乱码以及统计图乱码问题的解决方法
    今天就跟大家聊聊有关Cacti RRDTOOL中文乱码以及统计图乱码问题的解决方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。我安装的rrdtool是1.4.5的版本。为了解决这个...
    99+
    2023-06-13
  • Android webview打开本地图片上传实现代码
    Webview打开本地图片选择器十分之麻烦,其在安卓系统3x 4x 5x上的行为都不同,处理也不同,所以之前差点崩溃。经过测试和完善,最终其在各个版本上都能完美工作。 直接...
    99+
    2022-06-06
    图片上传 图片 地图 webview Android
  • Oracle&PLSQL 安装及乱码问题解决
    1,先到Oracle网站下载Instant Client ,如果有老版本,就不用下载了下载回是一个压缩文件,解压之后的文件夹叫:D:/instantclient_11_2.放在你喜欢的目录即可.例如:D:/...
    99+
    2024-04-02
  • uniapp小程序解决不能上传文件/图片问题
    uniapp小程序解决不能上传文件/图片问题 当前uniapp微信小程序无法使用formData( )来上传文件/图片,会出现FormData is not defined 问题, 而官方给的un...
    99+
    2023-10-01
    小程序 uni-app 微信小程序 javascript vue
  • java中如何解决web项目上传出现乱码问题
    在一般的web项目中,上传文件和下载文件很常见。但是当上传的文件名中包含中文时,有时会出现乱码问题。要解决这个问题,只需要统一的设置编码集就可以,这个可以通过Filter来实现。在线java视频教程推荐:java在线视频下面是写的Filte...
    99+
    2018-03-30
    java web 上传 乱码
  • 完全解决FTP上传文件名称中文乱码问题
    完全解决FTP上传文件名称中文乱码问题 说明无效踩坑经历 有效解决方法定时上传文件至ftp样例 说明 今天项目上加了个定时扫描本地文件路径下所有文件实现自动上传至ftp文件服务器的功能,经测试发现一旦上传中文名称的文件...
    99+
    2023-08-21
    服务器 java 运维
  • win7系统怎么解决打开写字板乱码问题
    小编给大家分享一下win7系统怎么解决打开写字板乱码问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!点击开始菜单,点击“控制面板”。将控制面板的查看方式修改为“...
    99+
    2023-06-28
  • dede织梦(dede5.7)上传图片出现302以及Error 2038问题解决方法
    在后台图片集中单张上传或多张同时上传,会出现302或Error #2038提示,并且无法上传图片。解决方案:编辑文件 根目录/include/userlogin.class.php在session()开始增加以下几行即可...
    99+
    2022-06-12
    dede织梦 dede5.7
  • 微信多图上传解决android多图上传失败问题
    微信提供了文件上传的方法wx.uploadFile来上传我们的图片 wx.chooseImage({ success: function(res) { var tempF...
    99+
    2022-06-06
    Android
  • vue+element-plus上传图片及回显问题及数量限制
    组件库 此篇可以完整帮助你解决编辑回显问题以及数量问题 常用的属性介绍: 首先hide_box: upload_btn是和css中的样式息息相关的  如果此值为true则隐...
    99+
    2023-05-16
    vue element-plus上传图片 vue element-plus回显
  • Ajax传输中文乱码问题怎么解决
    这篇文章主要介绍“Ajax传输中文乱码问题怎么解决”,在日常操作中,相信很多人在Ajax传输中文乱码问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ajax传输中文...
    99+
    2024-04-02
  • 乱码问题的原因及解决方法
    这篇文章主要讲解了“乱码问题的原因及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“乱码问题的原因及解决方法”吧!PHP乱码问题1、PHP 如何处理上传的CSV文件?可以用fgetcs...
    99+
    2023-06-17
  • 解决@ConfigurationProperties注解的使用及乱码问题
    目录@ConfigurationProperties解决方法第二种不推荐写法@ConfigurationProperties 作用:用于获取配置文件中的属性定义并绑定到javaBea...
    99+
    2022-11-13
    @ConfigurationProperties注解 @ConfigurationProperties使用 @ConfigurationProperties乱码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作