新入职一家公司第一天领导给了个任务
说上传文件到服务器速度太慢
结果读完代码发现了问题
原有代码是将大文件拆分成5兆的base64字符串存储到数据库
每次都需要读取数据库该文件的base64字符串和第二个拆分文件合并再存储到数据库
直至最后一条合并,该方式因为base64多次上传到数据库,导致数据库性能消耗很高,效率很慢
· 想到了一个解决方式就是既然效率慢的原因是数据库读写base64字符串导致,
· 为何不将base64存储到本地文本用来拼接,数据库只存本地文本的路径呢
· 说做就做,结果显而易见,之前200兆文件上传需要30分钟,现在只需要不到2分钟,(用的测试服务器较差)
· 因公司保密要求,只上关键代码,异常自己补充,下面是大致步骤
· 最下方有两个方法
//1.上传第一部分文件到本地,创建本地文本,将文件转为base64字符串存入文本
//2.设置本地文本路径
String filePath="D:/test.txt"
//3.判断本地文件是否存在,如果存在就追加写入,如果不存在则创建并写入
if (!file.exists()) {
boolean hasFile = file.createNewFile();
if(hasFile){
log.info("file not exists, create new file");
}
fos = new FileOutputStream(file);
} else {
fos = new FileOutputStream(file, true);
}
//4.选择字符编码格式防止乱码
osw = new OutputStreamWriter(fos, "utf-8");
osw.write(baseTxt); //写入内容
//5.关流
osw.close();
fos.close();
//6.合并并转为文件上传到本地
//7.取出字符串, 自己定义的getstr方法,在下面
String endFile = getstr(filepath);
//8.获取文件后缀格式
int index = taskFile.getWjm().lastIndexOf('.');
String fileName = FILE_PATH+UUID.randomUUID().toString().replace("-", "").toString()+taskFile.getWjm().substring(index);;
int pos = fileName.lastIndexOf("."); // 取文件的格式
UUID uuid = UUID.randomUUID();
String filenameurl = path + '\' + uuid +"."+ key.substring(pos);
//9.唯一标识数字和文件格式生成新的文件名,然后将文件存储到本地
try {
// 获取输出流
OutputStream os = new FileOutputStream(filenameurl);
// 创建一个缓冲区
byte[] buffer = new byte[1024];
// 判断输入流中的数据是否已经读完的标识
int len = 0;
// 循环将输入流读入到缓冲区当中,(len=is.read(buffer))>0就表示is里面还有数据
while ((len = is.read(buffer)) > 0) {
// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录当中
os.write(buffer, 0, len);
}
os.flush();
os.close();
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
url = url + filenameurl+";";
url=url.substring(0, url.length()-1);
//10. url就是生成合并后的文件存储在本地服务器的路径
//11.将文件存储路径url及其他信息存储入数据库
//12.删除本地临时拼接存储文本
if (!file.isDirectory()) {
file.delete();
}
–
取出合并后的字符串
public static String getstr(String filePath){
String str="";
File file=new File(filePath);
try {
FileInputStream in=new FileInputStream(file);
// size 为字串的长度 ,这里一次性读完
int size=in.available();
byte[] buffer=new byte[size];
in.read(buffer);
in.close();
str=new String(buffer,"UTF-8");
} catch (IOException e) {
// TODO Auto-generated catch block
log.error("接口:"+"UploadWork"+"读取文件字符串"+"异常:"+e);
return null;
}
return str;
}
–
将文件存入OSS服务器
OSSClient ossClient = new OSSClient(oss.getEndpoint(),oss.getAccessKeyId(),oss.getAccessKeySecret());
Objectmetadata objectmeta = new Objectmetadata();
objectmeta.setContentLength(inputStream.available());
System.err.println("inputStream.available() = " + inputStream.available());
System.err.println("ossClient = " + ossClient);
System.err.println("ossClient = " + ossClient.toString());
PutObjectResult putObjectResult = ossClient.putObject(oss.getBucketName(),key,inputStream,objectmeta);
ossClient.shutdown();



