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

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

express+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 {
  /**
   * 用于文件上传的转码
   * @param fileStr
   * @returns {string}
   */
  static iconv2utf8 = (fileStr) => {
    return iconv.decode(fileStr, 'gbk');
  }
  /**
   * 用于文件下载的转码
   * @param fileStr
   * @returns {NodeBuffer}
   */
  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));

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

(0)

相关推荐

  • nodejs express配置自签名https服务器的方法

    在nodejs中使用express来搭建框架可以说是非常的简单方便,但是一般默认创建的都是http服务器,也就是只能通过http协议进行访问.如今https已经是发展趋势,我们应该顺应时代的潮流.在本篇文章中,我们将会来使用自签名的方式创建证书,然后使用express框架来搭建https服务器,最后让浏览器或者客户端使用https协议进行访问. 首先我们要生成证书文件: (1)生成私钥key文件(下面的pathway表示你要保存的文件路径位置) openssl genrsa 1024 > /pa

  • node.js中express模块创建服务器和http模块客户端发请求

    首先下载express模块,命令行输入 npm install express 1.node.js中express模块创建服务端 在js代码同文件位置新建一个文件夹(www_root),里面存放网页文件等,就可以在浏览器中访问了 var express = require("express"); var path = require("path"); var app = express(); //目录 (当前目录下的www_root目录) app.use(expre

  • express提供http服务功能实现示例

    目录 先看使用 实现思路 具体实现 先看使用 const express = require('./express'); const app = express(); app.get('/',function (req,res){ res.end('/') }) app.get('/hello',function (req,res){ res.end('/hello'); }) app.listen(3000,function () { console.log('server start 300

  • C#实现给DevExpress中GridView表格指定列添加进度条

    目录 一.问题描述 二.实现方法 2.1.先注册单元格绘制方法 2.2.编写给指定单元格绘制进度条的方法 2.3.使用给指定单元格绘制进度条方法 三.相关内容 3.1.给单元格设置百分比 一.问题描述 在我们使用Winform配合DevExpress进行开发表格时,表格中的涉及到百分比数据的内容除了显示百分比的数字内容外,还希望搭配显示进度条效果(且低于百分之60的内容用红色表示不合格,高于百分之60的用绿色表示),这样百分比的显示效果更加清晰直观. 二.实现方法 2.1.先注册单元格绘制方法

  • 关于访问node express中的static静态文件方法

    目录 访问node express中的static静态文件 应用场合 解决方法 示例 Express访问静态资源(express.static) 前端调用静态资源 Express访问静态资源 访问node express中的static静态文件 应用场合 在项目中需要使用到node express框架进行中间件开发. 使用express托管静态文件或开放其它静态文件 解决方法 通过express内置的express.static方法可以方便地托管静态文件,例如图片.CSS.JavaScript文

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

    目录 express+multer上传图片打开乱码 原因 解决方法 简单的node文件上传下载及中文乱码 1. 基于MEAN的技术栈 2. 在前端代码中放置文件上传按钮和处理表单数据 3. 后端接收上传文件 4. 处理上传文件的乱码 5. 下载文件 6. 处理下载文件的乱码 express+multer上传图片打开乱码 原因 由于使用multer处理上传图片时,multer存储的是重命名的文件,文件并没有后缀名导致文件无法在服务器直接打开,手动加上后缀名就能打开文件. 如: 解决方法 引入fs模

  • php ckeditor上传图片文件名乱码解决方法

    打开editor/filemanager/connectors/php目录下commands.php,找到FileUpload函数,在 复制代码 代码如下: $sExtension = substr( $sFileName, ( strrpos($sFileName, '.') + 1 ) ) ; $sExtension = strtolower( $sExtension ) ; 后添加 复制代码 代码如下: $sFileName = rand(0,100).".".$sExtensi

  • 四个常见html网页乱码问题及解决办法

    上周同事在做网页时,遇到网页打开之后都是乱码,同事很迷茫了,不知道该怎么解决,下面是小编抽时间把比较常见的html网页乱码问题及解决办法整理分享给大家. 其实导致网页乱码主要有几个原因,以下给出解决方法. 1.HTML的字符编码问题 该问题较常见,也是最明显和最容易解决的. 在网页<head>中加上: <meta http-equiv="Content-Type" Content="text/html;charset=utf8"/> 即可.

  • php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)

    在做PHP程序时,需要使用PHP做的文件下载 那做就做呗把代码复制过来改了一改. 很多效果也出来了 那么点击下载后,恩,本以为搞定了文件下载,谁知道,图片打开的时候提示文件损坏,这我就观察了文件的大小.似乎真是多了 1KB左右. 使用PS打开,恩,提示了损坏,不过图象可以出来. 那么我就认为是 那多出来的 1kb的问题了. 然后,我把一个txt上传上去,然后下载. 果然发现,文件的前面以及后面,都多了几个 字符. 那我就在想应该怎么去掉啊.各种百度,谷歌,上论坛提问. 最后,经过我一个多小时的搜

  • 详解Linux中文乱码问题终极解决方法

    初入linux的程序员们,经常会受到乱码的问候.可谓"始乱终弃".因为乱码,并且最终放弃了linux的不在少数.好吧,言归正传,下面来看一下linux乱码的具体解决办法吧. 方法一: 修改/root/.bash_profile文件,增加export LANG=zh_CN.GB18030 该文件在用户目录下,对于其他用户,也必须相应修改该文件. 使用该方法时putty能显示中文,但桌面系统是英文,而且所有的网页中文显示还是乱码 方法二: 修改/etc/sysconfig/i18n文件 #

  • 解决dotproject中文名文件下载乱码问题的解决方法

    [问题] 文件管理,上传中文文件名的文件,下载时候文件名出现乱码. [解决] 还是编码问题,需要转码. 打开根目录下的fileviewer.php文件,找到一下代码: 复制代码 代码如下: <?php -- header('MIME-Version: 1.0'); header( 'Pragma: '); header( 'Cache-Control: public'); header( 'Content-length: '.$file['file_size'] ); header( 'Cont

  • python抓取并保存html页面时乱码问题的解决方法

    本文实例讲述了python抓取并保存html页面时乱码问题的解决方法.分享给大家供大家参考,具体如下: 在用Python抓取html页面并保存的时候,经常出现抓取下来的网页内容是乱码的问题.出现该问题的原因一方面是自己的代码中编码设置有问题,另一方面是在编码设置正确的情况下,网页的实际编码和标示的编码不符合造成的.html页面标示的编码在这里: 复制代码 代码如下: <meta http-equiv="Content-Type" content="text/html;

  • 使用express+multer实现node中的图片上传功能

    下文给大家介绍使用express+multer实现node中的图片上传功能,具体内容介绍如下所示: 在前端中,我们使用ajax来异步上传图片,使用file-input来上传图片,使用formdata对象来处理图片数据,post到服务器中 在node中使用multer中间件来对上传路由接口进行处理 multer文档 package.json html部分 <body> <div class="form-group"> <label>File input

  • ubuntu 服务器中文乱码问题的解决方法

    之前买了阿里云的服务器,后来在上面编辑中文字符的时候发现乱码,在网上找了下解决方案,发现比较乱,有的也不太好用,特此整理了一下可用的一个方案. 检查 检查是否已经安装了中文包支持.终端输入: sudo dpkg -l 查看是否安装了中文支持( language-pack-zh )的软件包. 安装 没有安装,那就终端执行命令 : apt-get install language-pack-zh 配置语言环境变量 vim /etc/environment 在下面添加如下两行: LANG="zh_CN

  • Visual Studio Code运行程序时输出中文成乱码问题及解决方法

    今天写代码,需要输出一些中文,于是就顺势发现了这个问题:VS Code输出中文成乱码.上网查询了一番后,我找到了解决方法,我决定将我看到的方法整理出来,帮助更多朋友.(windows10系统下) 1. 打开控制面板 可以点击电脑桌面上的相应图标打开 也可以点击桌面左下角开始按钮,找到W开头文件列表下的windows系统文件夹中的控制面板 2.选择时钟和区域下的更改日期.时间或数字格式 3.点击管理,然后点选择更改系统区域设置 4. 勾选Beta版:使用Unicode UTF-8提供全球语言支持,

随机推荐