web项目文件存取思路1——传统方法| 青训营

115 阅读2分钟

在web项目中,经常存在需要存储大量多媒体文件(如图片、音乐、视频等)的业务存在,因此如何对这些文件进行存储和读取是一件比较重要的事情。以下先介绍最传统的文件存取方法。

字节流存取

对于文件存取,最普通的方法就是将文件转化为字节流存储入数据库,然后需要时将字节流从数据库中读取出,然后转化成相应格式给前端: 以java项目+mysql为例

  • 图片:将图片文件或图片url地址传给后端后,后端将图片转化为byte[]类型,存入数据库(一般数据库对应字段为Blob类型)。读取时前端向后端请求,将数据库Blob数据取出映射为byte[]类型,然后将byte[]类型的数据编码为base64类型传给前端。前端接收到数据后加data:image/jpeg;base64前缀,即"data:image/jpeg;base64"+base64字符串。然后将这串字符串传递给图片组件,用src属性接收。
  • 视频类型:处理方法类似,后端输出视频流等。
  • 文件类型:处理方法类似,将文件流返回给前端。如需预览,可将后端将文件处理为OutStream返回给前端,前端可以处理为blob再包装为url进行预览。
const url = window.URL.createObjectURL(new Blob([response.data], { type: 'application/pdf' }));
            window.open(url, '_blank',"width=800,height=600");

缺点

显而易见,按字节流进行读取的方式虽然简单,但是存在很多的缺点。

  1. 文件存储在数据库表中占用大量内存空间,且若文件字节大会造成存取性能低,速度慢。
  2. 数据多次转码中可能会出错,导致问题(特别是在文件转byte[]过程中)。
  3. 处理完后传给前端的字符串数据量也比较大。 因此利用字节流进行存取的方式并不是很合适,并不建议大型项目使用。