Nodejs的学习Ⅷ(文件上传模块multer、文件下载、layui简单说明)

一、文件上传的中间件模块multer

详情参看官网

安装

cnpm install multer --save

二、multer的使用

html页面

<form action="http://localhost:8080/" method="post" enctype="multipart/form-data">		// 注意上传文件时要enctype="multipart/form-data"
	<input type="file" name="files" value="指定文件">	// 指定input的type为file
    <br><br>
    <input type="submit" value="上传">
</form>

node代码

const express=require("express");
const multer=require('multer');			
const upload=multer({dest:'./public/upload'});			// 初始化上传对象,上传的资源存储路径,dest:destination(目的地)
const fs = require('fs');var app=express();

​app.get('/', (request, response, next) => {
  response.render('fileup')
})

app.post("/fileup",upload.single("files"),function(req,res){   //files为input type="file"的name值,
//届时文件上传已经成功(不过文件名为随机值,需要更名)
	console.log(request.file);

	// 以下是在文件已经上传成功的情况下给文件重命名
    var oldFile=req.file.destination + '/' + req.file.filename; 	//指定旧文件的路径,记得路径之间加/
    var newFile=req.file.destination + '/' + req.file.originalname;   //指定新文件的路径,记得路径之间加/
    fs.rename(oldFile,newFile,function(err){		// 文件重命名
        if(err){
            res.send('重命名失败!');
        }else{
            res.send('重命名成功!');
        }
    });

	response.send('<img src="/upload/'+ request.file.originalname'"/>')	// 注意这里是以upload路径开始,而不是public(可能是中间件的作用)
});
​
app.listen(8080);

request.file的结果:

{
  fieldname: 'files',						// input type="file"的name值
  originalname: 'MQZ3SVZ`1G@F78XF1@`W{83.png',		// 用户计算机上的文件的名称
  encoding: '7bit', 				// 文件编码
  mimetype: 'image/png',				// 文件的 MIME 类型
  destination: './public/upload',				// 保存在服务器的路径
  filename: '832891ebbabf93a7961cc00b45980f39',				// 保存在服务器中的文件名
  path: 'public\\upload\\832891ebbabf93a7961cc00b45980f39',		//已上传文件的完整路径
  size: 14205 					//文件大小(字节单位)
}

三、上传多个文件

多个文件上传时要注意input要有multiple属性,而在服务端上,我们需要将single()改为array(“name”,num);的形式来接收多个文件的上传请求。最后对他们全部进行重命名。

在这之前我们首先看看multer支持哪些文件上传方式

.single(fieldname)  	// 接受一个为fieldname命名的文件
.array(fieldname[, maxCount])   // 接受一个以 fieldname 命名的文件数组。可以配置 maxCount 来限制上传的最大数量。
.fields(fields) // 接受指定 fields 的混合文件。fields是一个拥有name和maxCount的数组对象(多个input多个name)
.none()     // 只接受文本域。如果任何文件上传到这个模式,将发生 "LIMIT_UNEXPECTED_FILE" 错误。
.any()  // 接受一切上传的文件。

举例:

html文件:
<form action="http://localhost:8080/" method="post" enctype="multipart/form-data">
            <input type="file" name="files" value="指定文件" multiple>
            <br><br>
            <input type="submit" value="上传">
        </form>
node代码:
const express=require("express");
const multer=require('multer');
var upload=multer({dest:'./public/upload'});
var fs = require('fs');
​
​
var app=express();
​app.get('/', (request, response, next) => {
  response.render('fileup')
})

app.post("/fileup",upload.array("files",5),function(req,res,next){
    req.files.forEach(function(ele,index){		// req.files是数组(不是伪数组)
        console.log(ele);
        var oldFile=ele.destination+ '/' +ele.filename;   //指定旧文件,记得路径之间加/
        var newFile=ele.destination+ '/' +ele.originalname;   //指定新文件,记得路径之间加/
        fs.rename(oldFile,newFile,function(err){
            err?console.log('上传失败!'):console.log('上传成功!');
        });
    });
    res.send("成功上传");			// 上传成功+改名成功
});
​
app.listen(8080);

四、通过limits来限制上传文件

// limits对象的一些配置
fieldNameSize:   field 名字最大长度    100 bytes
fieldSize:   field 值的最大长度    1MB
fields:  非文件 field 的最大数量 无限
fileSize:    在 multipart 表单中,文件最大长度 (字节单位)   无限
files:   在 multipart 表单中,文件最大数量  无限
parts:   在 multipart 表单中,part 传输的最大数量(fields + files)    无限
headerPairs: 在 multipart 表单中,键值对最大组数 2000
如果你上传的文件超出这些设定,MulterError模块将会启用,该模块在node_modules/multer/lib/multer-error.js上:

我们可以使用err.code定位到该错误,他有7种code方式,不同设置会返回不同code

LIMIT_PART_COUNT
LIMIT_FILE_SIZE
LIMIT_FILE_COUNT
LIMIT_FIELD_KEY
LIMIT_FIELD_VALUE
LIMIT_FIELD_COUNT
LIMIT_FIELD_COUNT

简单实例:

html依然不变,node代码如下:

const express=require("express");
const multer=require('multer');
var upload=multer({dest:'./public/upload',limits:{fileSize: 1024 * 1024 * 20,files: 5}});
var fs = require('fs');var app=express();
​​app.get('/', (request, response, next) => {
  response.render('fileup')
})

app.get("/fileup",upload.array("files",5),function(req,res,next){
    req.files.forEach(function(ele,index){
        var oldFile=ele.destination+ '/' +ele.filename;   //指定旧文件
        var newFile=ele.destination+ '/' +ele.originalname;   //指定新文件
        fs.rename(oldFile,newFile,function(err){
            err?console.log('上传失败!'):console.log('上传成功!');
        });
    });
    next();
    res.send("上传成功!");				// 上传成功+改名成功
});
​
app.use(function(err,req,res,next){			// 文件上传错误具体信息的捕获
    if (err.code==='LIMIT_FILE_SIZE'){
        res.send('File is too large');
    }else if(err.code==='LIMIT_FILE_COUNT'){
        res.send('Too many files');
    }
})
​
app.listen(8080);

五、用axios实现文件上传

点击这里
作者:bayi_lzp
来源https://juejin.im/post/5cff13ab6fb9a07ee1691e82

六、文件下载

文件下载非常简单,仅需通过res.download() 执行即可

res.download('/report-12345.pdf');

实例:

html:
<form action="http://localhost:8080/" method="post" enctype="application/x-www-form-urlencoded">
	<input type="file" name="files" value="选择下载的文件"><br><br>
    <input type="submit" value="下载">
</form>
nodejs
const express=require("express");
const path = require('path')

var app = express();

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.get('/', (request, response, next) => {
  response.render('filedown')
})

app.post('/filedown/:imgname',(req, res, next) => {
  let urlpath = './public/upload/' + req.params.imgname		// 拼接资源路径,注意这里要把路径写完整
  res.download(urlpath)					// 开始下载
})

app.listen(8080, () => {
  console.log('服务器已连接');
})

七、layui简单说明

layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用。她区别于那些基于 MVVM 底层的 UI 框架(如:Vue)

layui下载文件的目录:

在这里插入图片描述
lay的使用与bootstrap类似,在这里就不赘述了,具体参考官网

本文只用于个人学习与记录

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用 nodejs 的 https 模块下载大文件,可以使用以下步骤: 1. 安装 https 模块: ``` npm install https ``` 2. 在代码中引入 https 模块: ``` const https = require('https'); ``` 3. 使用 https.request() 方法发起请求,获取响应流: ``` const request = https.request(url, (response) => { // response 即为响应流 }); ``` 4. 使用 pipe() 方法将响应流传输到可写流中,如 fs.createWriteStream(): ``` const writeStream = fs.createWriteStream('path/to/output/file.ext'); response.pipe(writeStream); ``` 5. 在响应流的 'end' 事件中关闭可写流: ``` response.on('end', () => { writeStream.close(); }); ``` 6. 记得在请求中调用 request.end() 方法来结束请求: ``` request.end(); ``` 完整示例代码如下: ``` const https = require('https'); const fs = require('fs'); const url = 'https://example.com/large/file.ext'; const request = https.request(url, (response) => { const writeStream = fs.createWriteStream('path/to/output/file.ext'); response.pipe(writeStream); response.on('end', () => { writeStream.close(); }); }); request.end(); ``` 注意:这种方法只适用于下载小于 2GB 的文件。如果要下载更大的文件,可以使用其他方法,例如使用流式读写来分块下载文件。 ### 回答2: 使用Node.js的https模块可以实现下载大文件的功能。具体步骤如下: 1. 首先,引入Node.js的https模块和fs模块,执行以下代码: ```javascript const https = require('https'); const fs = require('fs'); ``` 2. 创建一个可写流(write stream)以保存下载的文件,可以指定文件的路径和名称。例如,创建一个名为“example.mp4”的文件,可以使用以下代码: ```javascript const file = fs.createWriteStream('example.mp4'); ``` 3. 发起https请求,通过get方法下载文件。需要指定要下载的文件的URL和请求的头部信息。下面是一个具体的示例代码: ```javascript https.get('https://example.com/large_file.mp4', function(response) { // 将响应的数据传送到文件流 response.pipe(file); }); ``` 4. 下载过程中,文件将被写入指定的文件流,并自动保存到指定的文件路径。下载完成后,可以对文件进行任何所需的处理。 ```javascript file.on('finish', function() { console.log('文件下载完成。'); }); file.on('error', function(err) { console.error('文件下载失败:', err); }); ``` 通过以上步骤,我们可以使用Node.js的https模块下载大文件。需要注意的是,如果下载的文件过大,可能会占用较长时间和较大内存空间,因此需要根据具体情况进行调整和优化。 ### 回答3: 在Node.js中使用https模块下载大文件的关键是要使用流的方式进行下载,以避免将整个文件加载到内存中。 首先,我们需要引入http和fs模块: const https = require('https'); const fs = require('fs'); 然后,我们可以创建一个可写流来存储下载的文件: const file = fs.createWriteStream('文件路径'); 接下来,我们可以使用https.get方法来发送GET请求并将响应流导入到我们创建的可写流中: https.get('要下载的文件URL', function(response) { response.pipe(file); }); 上述代码中,我们将下载的文件URL传递给https.get方法。然后,我们使用response.pipe方法将响应的数据导入到我们创建的可写流中。这将会自动将数据写入到文件中。 需要注意的是,当下载大文件时,可能会消耗较多的内存。为了解决这个问题,我们可以使用管道(pipe)机制,将响应流直接导入到可写流中,而不是缓存整个响应数据。 当整个文件下载完成后,我们可以监听可写流的finish事件,来执行一些操作: file.on('finish', function() { console.log('文件下载完成'); }); 通过以上方法,我们可以使用https模块Node.js中下载大文件。但是需要注意,如果要下载非常大的文件或者需要进行进一步的处理,可能需要考虑使用一些分块下载、断点续传或者并发下载的技术来提高效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值