栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

大文件上传及拆分上传至服务器本地,OSS服务器,文件拆分合并上传

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

大文件上传及拆分上传至服务器本地,OSS服务器,文件拆分合并上传

大文件上传拆分,使用base64写入本地txt拼接合并上传,拆分上传

新入职一家公司第一天领导给了个任务

说上传文件到服务器速度太慢

结果读完代码发现了问题

原有代码是将大文件拆分成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();
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/467805.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号