文件服务
文件存储服务
文件存储的方式可以保存在磁盘上,也可以保存进一些存储服务。我们选择使用miniio用来作为文件的存储。
启动服务
使用docker启动存储服务,将以下内容保存为yaml文件(如docker.yaml),或将内容合并至某一个已存在的docker配置文件中,并使用docker-compose启动它
version: '3.7'
services:
minio:
image: minio/minio
command: server /data
volumes:
- ./data/minio:/data
ports:
- 9000:9000
environment:
MINIO_ACCESS_KEY: 01factory
MINIO_SECRET_KEY: 01factory
配置连接参数
项目下新建mm.json文件(如果已存在,向里面新增内容即可)
{
"minio": {
"endPoint": "127.0.0.1",
"port": 9000,
"accessKey": "01factory",
"secretKey": "01factory",
"useSSL": false,
"region": "cn-north-1",
"partSize": 5242880
}
}
使用命令docker-compose启动它
sudo docker-compose -f ./docker.yml up
安装依赖库
文件服务配置
凡是需要读取文件的服务,均需将服务配置中的bodyParser值修改为false
。
export const config = {
api: {
bodyParser: false
}
} as PageConfig;
上传
可以使用我们封装好的一个原子操作@mmstudio/an000045
来完成。
安装依赖库
yarn add @mmstudio/an000045 @mmtudio/config
使用原子操作
handler.put(async (req, res) => {
const fileinfos = await an45(req);
res.status(200).json(info);
});
下载
使用原子操作@mmstudio/an000046
完成
export type Query = {
id: string;
}
handler.get(async (req, res) => {
const query = req.query as Query;
const id = query.id;
const downlaod = req.query.download as string;
await an46(id, downlaod, req, res);
});
删除
使用原子操作@mmstudio/an000053
import an53 from '@mmstudio/an000053';
await an53(id1, id2, id3);
替换
替换其实就是删除+保存的过程。可以使用原子操作@mmstudio/an000054
图片/视频
图片文件按一般文件处理即可,但是视频文件除了像其它类型文件一样处理之外,需要获取视频的播放时长等媒体信息,就不能只是保存一样那么简单,原子操作@mmstudio/an000044
可以处理这问题,但这需要电脑上安装有相应的应用。
安装
sudo apt install -y ffprobe ffmpeg libx264-155
yarn add @mmstudio/an000044 @mmstudio/config
Excel
我们也经常会用到excel文件的解析,生成以及excel的动态生成等。
解析excel
使用原子操作@mmstudio/an000041
可以将用户上传的文件保存到临时目录。然后使用另外一个原子操作@mmstudio/an000024
通过excel的转换将其转换为json,用以数据处理.在所有文件处理完,不要忘了删除临时文件。以下为完整的一段示例代码:
interface IData {
name: string;
phone: string;
}
export type Result = IData[];
const handler = nextConnect<NextApiRequest, NextApiResponse<Result>>();
handler.put(async (req, res) => {
const files = await an41(req);
const ps1 = Promise.all(files.map((file) => {
return fs.readFile(file.path);
}));
const filbufs = await ps1;
const ps2 = Promise.all(filbufs.map((filebuff) => {
const p1 = filebuff;
return an24<IData>(p1);
}));
void files.forEach((file) => {
return fs.rm(file.path);
});
const data = await ps2;
res.status(200).json(data[0][0]);
});
export const config = {
api: {
bodyParser: false
}
} as PageConfig;
下载excel
如果是制作好的excel模板,可以将excel模板放在项目目录的public目录下,然后页面上直接使用超链接即可下载。
如果是上传到存储服务中的excel文件,则可以像普通文件一样使用原子操作@mmstudio/an000046
进行下载。
如果需要动态生成excel文件。比如需要使用实时数据导出excel文件,则需要借助nodejs上可用的第三方包,如excel.js来完成。