win10 node: v8.2.1 npm: v5.3.0 multer: v1.3.0
使用
1.由于对multer v1.3.0做了修改,所以不可以通过npm install multer
这种形式,需要使用到修改过multer包去覆盖原来的。
2.对于文件上传的接口,比如/upload
,需要携带参数targetFileName和start。
- targetFileName: 服务端生成目标文件的名字。targetFileName可在seg-worker.js中导出。seg-worker是一个web worker。
var w1 = new Worker('seg-worker.js'); w1.postMessage({file: file})
- start: 写入到这个文件中的位置。
3.如果是分段上传,需要在multer.diskStorage中添加一个字段seg。
multer.diskStorage({
destination: cb,
filename: cb,
seg: true
})
同时需要修改源码。见下文update4。
在multerv1.3.0版本中,通过multer.memoryStorage
和multer.diskStorage
來配置文件的destination
和filename
。具体怎么写入的这些细节multer内部做了封装。下面是实现过程。完整流程图在最下方。
update1
同一个用户可能会重复上传看似相同实则不同的文件。比如两个文件,文件名一样、大小一样、相关时间都一样。但是内容不一样。这样服务器会判断出两个文件是一样的,禁止用户重复上传。
解决这个问题是在前端使用一个spark-md5的库。该库会根据文件内容计算出文件的md5。
update2
因为是大文件,要做分段上传,并且还可以续传。比如,对于一个2g的大文件,如果上传到中途因为断网需要从头开始上传,这是很麻烦的事情。断