nodejs --- 上传文件并保存到磁盘

先复习下整个请求的过程

const express = require(‘express‘);
const static = require(‘express-static‘);
const cookieParser = require(‘cookie-parser‘);
const cookieSession = require(‘cookie-session‘);
const bodyParser = require(‘body-parser‘);
const multer = require(‘multer‘);
const ejs = require(‘ejs‘);
const jade = require(‘jade‘);

const server = express();

server.listen(8999);

// 解析cookie
server.use(cookieParser(‘dfadfasdfa‘));

// 解析session
let arr = [];
for(let i = 0; i < 100000; i++) {
    arr.push(‘key_‘ + Math.random());
}

server.use(cookieSession({name: ‘jason_name‘, keys: arr, maxAge: 20*3600*1000}));

// post数据
server.use(bodyParser.urlencoded({extended: false}));
server.use(multer({dest: ‘./www/upload‘}).any());

// 用户请求
server.use(‘/‘, (req, res, next) => {
    console.log(req.query, req.body, req.files, req.cookie, req.session);
});

server.use(static(‘./www‘));

测试下能不能上传

const express = require(‘express‘);
const bodyParser = require(‘body-parser‘);
const multer = require(‘multer‘);
// fs 可以用来添加上传文件的扩展名(重命名)
const fs = require(‘fs‘);
const pathLib = require(‘path‘);

const server = express();

// 创建一个上传文件对象
// let objMulter = multer({dest: ‘./www/upload‘});

server.use(bodyParser.urlencoded({extended: false}));
// server.use(objMulter.any());

server.post(‘/‘, (req, res) => {
    console.log(‘req.body==>‘,req.body);
    // 当请求是 enctype=application/x-www-form-urlencoded
    // req.body==> { f1: ‘mmexport1485905379121.jpg‘ }
    // 当请求是 multertype/form-type
    // req.body==> {}
    // console.log(‘req.files==>‘, req.files);
});

server.listen(8999);

上传的表单文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <form action="http://localhost:8999" method="post" enctype="application/x-www-form-urlencoded">
    <!-- <form action="http://localhost:8999" method="post" enctype="multipart/form-data"> -->
    <!-- <form action="http://localhost:8999" method="post" enctype="text/plain"> -->
        文件: <input type="file" name="f1"> <br/>
        <input type="submit" value="上传">
    </form>
</body>
</html>

这是因为body-parser 只能处理application/x-www-form-urlencoded

文件上传 需要使用 multer 模块 用来处理 multipart/form-data

const express = require(‘express‘);
const bodyParser = require(‘body-parser‘);
const multer = require(‘multer‘);
// fs 可以用来添加上传文件的扩展名(重命名)
const fs = require(‘fs‘);
const pathLib = require(‘path‘);

const server = express();

// 创建一个上传文件对象
let objMulter = multer({dest: ‘./www/upload‘});

// server.use(bodyParser.urlencoded({extended: false}));
server.use(objMulter.any());

server.post(‘/‘, (req, res) => {
    // console.log(‘req.body==>‘,req.body);
    console.log(‘req.files==>‘, req.files);
     // req.files==> [ { fieldname: ‘f1‘,
     //    originalname: ‘IMG_20170125_212945.jpg‘,
     //    encoding: ‘7bit‘,
     //    mimetype: ‘image/jpeg‘,
     //    destination: ‘./www/upload‘,
     //    filename: ‘fa0b73da8bdbcb36e9480e9869c0a2b7‘,
     //    path: ‘www\\upload\\fa0b73da8bdbcb36e9480e9869c0a2b7‘,
     //    size: 226929 } ]

});

server.listen(8999);

这个时候你会发现文件上传了,但是文件名没有扩展名

fs中重名的函数rename

fs.rename(‘a.txt‘, ‘b.txt‘, (err) => {

console.log(err);

});

获取扩展名的插件  path  可以小小的测试下 这个node中的path插件

const path = require(‘path‘);

let str = ‘c:\\wamp\\www\\a.html‘;

let obj = path.parse(str);

console.log(obj);

// {
//   root: ‘c:\\‘,
//   dir: ‘c:\\wamp\\www‘,
//   base: ‘a.html‘,
//   ext: ‘.html‘,
//   name: ‘a‘
// }

// base   文件名部分

// ext     扩展名部分

// dir      文件路径(目录)

// name  文件名(不包含扩展名)

然后讲path插件添加进文件

const express = require(‘express‘);
const bodyParser = require(‘body-parser‘);
const multer = require(‘multer‘);
// fs 可以用来添加上传文件的扩展名(重命名)
const fs = require(‘fs‘);
const pathLib = require(‘path‘);

const server = express();

// 创建一个上传文件对象
let objMulter = multer({dest: ‘./www/upload‘});

// server.use(bodyParser.urlencoded({extended: false}));
server.use(objMulter.any());

server.post(‘/‘, (req, res) => {
    // console.log(‘req.body==>‘,req.body);
    console.log(‘req.files==>‘, req.files);
     // req.files==> [ { fieldname: ‘f1‘,
     //    originalname: ‘IMG_20170125_212945.jpg‘,
     //    encoding: ‘7bit‘,
     //    mimetype: ‘image/jpeg‘,
     //    destination: ‘./www/upload‘,
     //    filename: ‘fa0b73da8bdbcb36e9480e9869c0a2b7‘,
     //    path: ‘www\\upload\\fa0b73da8bdbcb36e9480e9869c0a2b7‘,
     //    size: 226929 } ]
    //1.获取原始的扩展名  2.重命名临时文件
    let newName = req.files[0].path + pathLib.parse(req.files[0].originalname).ext
    fs.rename(req.files[0].path, newName, (err) => {
        if(err) {
            console.log(‘重命名失败‘);
        }else {
            console.log(‘命名成功‘);
        }
    });
});

//     req.files==> [ { fieldname: ‘f1‘,
//     originalname: ‘IMG_20170125_212945.jpg‘,
//     encoding: ‘7bit‘,
//     mimetype: ‘image/jpeg‘,
//     destination: ‘./www/upload‘,
//     filename: ‘bb031c31a1016648703a0d54cc93f674‘,
//     path: ‘www\\upload\\bb031c31a1016648703a0d54cc93f674‘,
//     size: 226929 } ]
// 命名成功

server.listen(8999);

到此,文件成功的保存到磁盘中,并且大小一致

总结:

body-parser      解析post数据     application/x-www-form-urlencoded

multer               解析post文件      multipart/form-data

let  obj = multer({dest: ‘上传路径‘});

server.use(obj.any());

server.use( (req, res) => {

req.files[0].originalname

req.files[0].path

});

fs.rename(老名字, 新名字, (err) => {

});

时间: 2024-08-10 17:19:21

nodejs --- 上传文件并保存到磁盘的相关文章

nodejs 上传文件

只是现在主要用nodejs做后端了,所以记录一些上传文件的使用方法. 上传文件的主要方式: 1.form上传,优点是方便,缺点是没法回调,上传后返回的数据没法处理 2.ajax上传,优点是可控制,有回调,缺点是不太方便 用form上传,express后端接收,有很多插件,如formidable.但是没有回调. 用ajaxFileUpload上传,express后端接收.看着像是ajax上传,其实中间会生成form multipart/form-data,所以可以使用multipart(也是一个e

springboot 头像上传 文件流保存 文件流返回浏览器查看 区分操作系统 windows 7 or linux

1 //我的会员中心 头像上传接口 2 /*windows 调试*/ 3 @Value("${appImg.location}") 4 private String winPathPic; 5 /*linux 使用*/ 6 @Value("${img.location}") 7 private String linuxPathPic; 8 9 @PostMapping(value = "/file") 10 public String file(

thinkphp表单上传文件并将文件路径保存到数据库中

上传单个文件,此文以上传图片为例,上传效果如图所示 创建数据库upload_img,用于保存上传路径 CREATE TABLE `seminar_upload_img` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `img_name` varchar(255) DEFAULT NULL COMMENT '图片名称',  `img_url` varchar(255) DEFAULT NULL COMMENT '图片路径',  `create_time` te

Servlet中服务器端接收上传文件操作

最近老大分了一个任务,客户端使用C#实现了文件上传,要求我实现服务器端的文件接收保存到本地并且接收成功返回给客户端一个标识.在网上看了一下,大多数都是客户端的文件上传操作,很少有写服务端的处理,借此次机会,分享一下自己在服务端实现的处理逻辑.废话不多说,直接上代码 public class ReciveServlet extends HttpServlet { private static final long serialVersionUID = 1Lpublic ReciveServlet(

JSP简单练习-上传文件

注意:在编写上传文件的代码时,需确保"WEB-INF/lib"下含有jspsmartupload.jar包,否则会出错. jspSmartupload.jar下载 <!-- uploadfileform.jsp --> <%@ page language="java" contentType="text/html; charset=gb2312" %> <html> <head> <title

上传文件时的后台处理

asp.net core 上传文件controller保存 long size = 0; var files = Request.Form.Files; if (0 == Request.Form.Files.Count()) return Json("NoPicture"); foreach (var file in files) { var filename = ContentDispositionHeaderValue .Parse(file.ContentDisposition

html加C#上传文件

最近在学上传文件部分内容,包括创建文件夹,设置文件夹属性,上传文件并保存. 前台代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><

commons-fileupload上传文件

上传依赖的jar: 前台jsp页面注意: <form action="<%=basePath %>servlet/UploadServlet" enctype="multipart/form-data" method="post"> jsp页面: <%@ page language="java" import="java.util.*" pageEncoding="u

文件上传表单 上传文件的细节 文件上传下载和数据库结合

1 文件上传表单   1)上传文件的本质是文本复制的过程   2)技术层面,在Java中一定会用到IO操作,主要以二进制方式读写   3)传统方式下,对于上传文件字段不同的浏览器有着不同的解析方式,例如:     IE6:upfile=c:\aa\bb\a.JPG     非IE6: upfile=a.JPG   4)可以将form以MIME协议的方式将上传文件传递到服务端,服务端以二进制流的方式读写     代码:客户端form enctype="multipart/form-data&quo