前端表单
<form action="http://localhost:8080/" method="POST" enctype="multipart/form-data">
文件:<input type="file" name="f1"> <br>
<input type="submit" value="上传">
</form>
首先 类型一定得是POST类型
enctype=“multipart/form-data” 表示所上传的是文件本身 ,而不是文件名,可以尝试如果不加这句的话上传的将不是文件本身
然后要引入的是一个multer 模块,npm中下载之后引进来
var objMulter = multer({dest:'./www/update'});
使用的时候需要定义对象来操作 dest则是文件传过来存放的目录
server.use(objMulter.any());
这里代表接受前台传过来的任意类型的数据
理论上来讲 现在已经可以接受到所传过来的信息了,我们尝试传一张照片看结果
的确拿到了文件
但是打开之后这样显示
这显然不是想要的结果。问题出在了上传后的文件名和路径上
先下载fs path模块并引入进来
server.use('/',function(req,res){
var str = req.files[0].originalname;//原始名(上传之前)
var name = req.files[0].path;//上传之后的文件名变成了一个随机的没有扩展名的数据
});
上面代码着重看一下str 和 name 如果在分别打印他们,我们就会发现二者分别是
上传的图片的名字和一串随机的数据,随机数据前面正好是刚才确定的路径(dest)
再加上刚才那个未知的文件出现的位置 我们大概可以确定,name就是上传后的文件
名,而打不开的原因则是它缺少了文件的后缀(扩展名)。思路是从str里面拿
所以现在要做的就是获取str的扩展名,然后拼接在name里面
var ext = path.parse(str).ext;
path.parse的解析结果为(以我的图片解析结果为例)
{ root: ‘’,
dir: ‘’,
base: ‘desk.jpeg’,
ext: ‘.jpeg’,
name: ‘desk’ }
的一个对象, ext属性就是扩展名了
接下来要修改文件名
fs.rename(name A,nameB)//将文件名从B改成A
具体操作:
fs.rename(name,name+ext,function(err){
if(err){
console.log(err);
res.send('上传失败');
}else{
res.send('上传成功');
}
});
完整代码为:
const express = require('express');
const bodyParser = require('body-parser');
const multer = require('multer');
var path = require('path');
var fs = require('fs');
var server = express();
var objMulter = multer({dest:'./www/update'});//在使用multer的时候 要先建立一个对象 传参dest是上传路径
server.listen(8080);
// server.use(bodyParser.urlencoded({extended:false})); 如果是解析post数据,就这样写
server.use(objMulter.any());//表示接受任何上传的文件
server.use('/',function(req,res){
var str = req.files[0].originalname;//原始名(上传之前)
var ext = path.parse(str).ext;//通过path.parse解析,最后拿到扩展名
var name = req.files[0].path;//上传之后的文件名变成了一个随机的没有扩展名的数据
fs.rename(name,name+ext,function(err){//在这串数据后面加上扩展名就可以了
if(err){
console.log(err);
res.send('上传失败');
}else{
res.send('上传成功');
}
});
});