本文主要是介绍大文件保存(大于100M)到Mysql,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近尝试了下实现文件上传和下载的功能:
尝试一:
上传:将文件以二进制流的形式上传,一次性读取到内存,然后将输入流转成字节数组,保存到mysql表的一个字段。
下载:将mysql中字节流一次性全部读到内存并转成输入流,然后写到本地文件中。
准备工作:
①mysql 中类型 longblob:可存4GB大小数据。
②mysql服务默认一次存取文件大小设置;
通过如下 命令查询默认读取文件大小:
show VARIABLES like '%max_allowed_packet%'
我的机器为4M,如图所示:
由于本次上传的文件大小为150M,所以暂时修改该值为200M
set global max_allowed_packet =1024*1024*200;//一次存取数据200M
此外,还要确保JVM堆内存足够。
③javaBean 使用 byte[] 来对应mysql中 longblob类型
④使用mybatis 的mappper.xml映射文件时,需要配置类型解析器(typeHandler),如下
<result column="file" property="file" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler"/>
javaBean:
public class UserEntity {private int id;private String creator;private byte[] file; public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCreator() {return creator;}public void setCreator(String creator) {this.creator = creator;}public byte getFile() {return file;}public void setFile(byte file) {this.file = file;}
}
//上传public String testUpload1() throws IOException {InputStream in = new FileInputStream("F:\\mobileSmall1.txt");//一次性读入内存UserEntity entity = new UserEntity();entity.setCreator("00000001"); //entity.setId(1);byte[] array = FileCopyUtils.copyToByteArray(in);entity.setFile(array);userService.addFile(entity); //保存到数据库in.close();
}
//下载public void download(){UserEntity entity = new UserEntity();entity.setCreator("00000001");entity.setId(1);entity = userService.getFileById(entity);//从数据库中读取OutputStream outStream = new FileOutputStream("F:\\downmobileSmall1.txt");byte[] buffer = entity.getFile();outStream.write(buffer);outStream.flush();outStream.close();}
缺点:容易发生OOM。 文件不能大,同时上传下载的的任务不能太多。
尝试二:
上传:利用输入流,每次读取5M大小的数据到内存,然后保存到数据库中的一条记录。大小为L兆的文件,保存为(L/5)或(L/5+1)条记录,每条记录有个Id字段(自增),保证有顺序。
下载:以流的方式读取mysql的数据,每次读取一条到数条记录到内存,防止一次性读取全部数据,占用太多内存。
提升:相比于第一种方法,该方法能在一定程度上解决内存限制问题,可以增加上传或下载文件的任务数量。
尝试3:
上传:将文件上传到文件系统(文件流部分加载的方式),然后将文件保存路径存储到mysql。
下载:提供文件的url,浏览器自动下载。
注:将文件保存在文件系统中,mysql只保存路径,数据量少,存取速度快;另外,文件下载时不需要后端参与,浏览器直接通过http请求获取文件。
这篇关于大文件保存(大于100M)到Mysql的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!