先复习下整个请求的过程

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(); // 解析cookie
server.use(cookieParser('dfadfasdfa')); // 解析session
let arr = [];
for(let i = ; i < ; i++) {
arr.push('key_' + Math.random());
} server.use(cookieSession({name: 'jason_name', keys: arr, maxAge: **})); // 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();

上传的表单文件

<!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();

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

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[].path + pathLib.parse(req.files[].originalname).ext
fs.rename(req.files[].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();
 
到此,文件成功的保存到磁盘中,并且大小一致
 
总结: 
     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) => {
 
});
 

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

  1. Express下使用formidable实现POST表单上传文件并保存

    Express下使用formidable实现POST表单上传文件并保存 在上一篇文章中使用formidable实现了上传文件,但没将它保存下来. 一开始,我也以为是只得到了文件的相关信息,需要用fs. ...

  2. nodejs 上传文件 upload

    只是现在主要用nodejs做后端了,所以记录一些上传文件的使用方法. 上传文件的主要方式: 1.form上传,优点是方便,缺点是没法回调,上传后返回的数据没法处理 2.ajax上传,优点是可控制,有回 ...

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

    //我的会员中心 头像上传接口 /*windows 调试*/ @Value("${appImg.location}") private String winPathPic; /*l ...

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

    上传单个文件,此文以上传图片为例,上传效果如图所示 创建数据库upload_img,用于保存上传路径 CREATE TABLE `seminar_upload_img` (  `id` int(11) ...

  5. Linux下开发python django程序(设置admin后台管理上传文件和前台上传文件保存数据库)

    1.项目创建相关工作参考前面 2.在models.py文件中定义数据库结构 import django.db import modelsclass RegisterUser(models.Model) ...

  6. app端上传文件至服务器后台,web端上传文件存储到服务器

    1.android前端发送服务器请求 在spring-mvc.xml 将过滤屏蔽(如果不屏蔽 ,文件流为空) <!-- <bean id="multipartResolver&q ...

  7. Servlet 实现上传文件以及同时,写入xml格式文件和上传

    package com.isoftstone.eply.servlet; import java.io.BufferedReader; import java.io.BufferedWriter; i ...

  8. java servlet上传文件并把文件内容显示在网页中

    servlet3.0(JDK1.6)自带的API即可实现本地文件的上传,Servlet3.0新增了Part接口,HttpServletRequest的getPart()方法取得Part实现对象.下面我 ...

  9. php上传文件时出现错误:failed to open stream: Permission denied

    尝试使用php写了一段小的上传程序,但是在使用的时候,在上传文件时出现这个错误,由于之前在写程序要读文件,曾经出现过这个问题,当时是因为要读的文件的权限不够,于是使用chmod 775 1.txt把文 ...

随机推荐

  1. HTTP响应状态码说明

    当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(Server Header)用以响应浏览器的请求. HTTP状态码共分为五种类型: 1**:信息,服务器接收到请求,需 ...

  2. 解决:无法将文件“obj\x86\Debug\Windows123.exe”复制到“bin\Debug\Windows123.exe”。

    警告 加载属性“OutputPath”失败. 输入的路径不是有效的输出路径. 解决方案: 先项目打包备份一下哦,再执行以下操作哦. 1.右键项目属性, 发布,发布位置修改成 publish\ 生成 , ...

  3. 记录.NET Core部署到Linux之.NET Core环境搭建(1)

    1.在安装.NET之前,您需要注册Microsoft密钥.注册产品存储库和安装所需的依赖项. 启动我们的虚拟机,输入以下命令: sudo rpm -Uvh https://packages.micro ...

  4. ARM 编译工具keil 和 IAR 命令行编译和下载

    目的 不管是Keil还是IAR对代码补全,高亮等编辑功能支持的不是很好,虽然现在的Keil 5.25对界面的支持好了很多,但是很多人还是青睐于第三方的编辑器,命令行的编译方式可以让我们在使用第三方编辑 ...

  5. SQL学习笔记2

    2018.10.16:周二 --进阶   --别名 SELECT StuName,StuNum+','+StuClass+','+StuGender+','+StuPhone AS 信息 FROM S ...

  6. css小点心

    本文由作者邹欣华授权网易云社区发布. 有一个在邮件中用饼图直观地显示用户的各项消费比例的需求.邮箱中不能用js,纯css实现饼图,只能通过后端模版渲染数据,所以数据越少越简单越好. 想到css3的tr ...

  7. 如何使用socket进行java网络编程(四)

    在上一篇的结尾,提到过用来处理每一个服务端accept到的socket,我们由原来最开始的单线程改成了多线程去处理,但是对每一个接收到的socket都new一个thread去处理,这样效率太低,我们需 ...

  8. 如何使用socket进行java网络编程(二)

    通过在如何使用socket进行java网络编程(一)中程序的编写,可以总结出一些常用的java socket编程的范例来. ServerSocket server = new ServerSocket ...

  9. CSS3盒子模型(下)

    绝对定位的盒子水平/垂直居中 普通的盒子是左右margin 改为 auto就可, 但是对于绝对定位就无效了 定位的盒子也可以水平或者垂直居中,有一个算法. 首先left 50% 父盒子的一半大小 然后 ...

  10. iOS-WKWebview 带有进度条加载的ViewController【KVO监听Webview加载进度】

    前言 为什么要说 WKWebview,在之前做电子书笔记时已经提过 WKWebview 在iOS8之后已完全替代 Webview,原因就不多说了,主要还是内存过大: 封装 封装一个基于 UIViewC ...