express 文件流上传下载 文件流切分
时间: 2023-09-11 15:04:13 浏览: 49
文件流上传和下载在 Express 中可以通过使用中间件 `multer` 来实现。下面是一个基本的文件上传和下载的示例代码:
文件上传:
```javascript
const express = require('express');
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
const app = express();
app.post('/upload', upload.single('file'), (req, res) => {
console.log(req.file);
res.send('File uploaded successfully.');
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
```
文件下载:
```javascript
const express = require('express');
const fs = require('fs');
const app = express();
app.get('/download', (req, res) => {
const file = `${__dirname}/example.pdf`;
const stat = fs.statSync(file);
res.setHeader('Content-Length', stat.size);
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=example.pdf');
const stream = fs.createReadStream(file);
stream.pipe(res);
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
```
文件流切分可以使用 `stream.Transform` 类来实现。下面是一个将文件流按照指定大小分块的示例代码:
```javascript
const stream = require('stream');
class Chunker extends stream.Transform {
constructor(options) {
super(options);
this.chunkSize = options.chunkSize || 1024;
this.buffer = Buffer.alloc(0);
}
_transform(chunk, encoding, callback) {
this.buffer = Buffer.concat([this.buffer, chunk]);
while (this.buffer.length >= this.chunkSize) {
const chunk = this.buffer.slice(0, this.chunkSize);
this.buffer = this.buffer.slice(this.chunkSize);
this.push(chunk);
}
callback();
}
_flush(callback) {
if (this.buffer.length > 0) {
this.push(this.buffer);
}
callback();
}
}
const fs = require('fs');
const input = fs.createReadStream('example.pdf');
const output = fs.createWriteStream('example.chunked');
const chunker = new Chunker({ chunkSize: 1024 });
input.pipe(chunker).pipe(output);
```
在上述代码中,`Chunker` 是一个继承自 `stream.Transform` 的类,用于将文件流按照指定大小分块。在 `_transform` 方法中,我们将新的数据块加入到缓冲区中,并不断从缓冲区中取出指定大小的数据块,将其推入输出流中。在 `_flush` 方法中,我们将剩余的数据块推入输出流中。最后,我们使用 `fs.createReadStream` 和 `fs.createWriteStream` 创建输入流和输出流,并将数据流经过 `Chunker` 实例处理后再写入到输出流中。