关于Java批量导入节目,求思路

导入材料:节目excel(excel一行就是一个节目);Zip压缩包(节目图片)。
需求:导入的excel大概有300个节目,图片大概有900张大概2G。
图片说明
做个假设:一次请求,把上传的excel,zip读入内存;excel把它解析成List,一个元素对应excel的一行。zip解析为一个Map,key图片名字,value图片流。图片流和excel找到映射关系后,做裁图(特定尺寸)保存在服务器静态资源端。然后落值数据库。
思路:前台:new FormData(),multipart/form-data;charset=UTF-8的http的POST请求;后台springmvc的MultipartFile接受两数据。通过解析构造出合理的数据类型,落值一条一条的节目。
矛盾:
1.图片资源过大,考虑用户带宽,请求是通过http协议的。
2.效率问题
3.内存的压力
4.用多线程去提高效率
补充:对于批量这个概率不是太清楚;Zip包里边图片,一个节目对应三张。
前面的假设是针对不超过200M的上传数据,现在数据量增加了,想做一个新思路的解决方法,求大家给点点子,欢迎一起研究这个问题
感谢:各位大哥谢谢你们的建议,我回去整理整理,最终我用了谁的建议,我就把币给谁,币不多一点心意,莫怪莫怪。最终我会把我的实现思路共享给大家。

7个回答

可以考虑异步的方式 :
1.文件上传, 现在Html5应该能切割上传, 但是对带宽压力减轻不明显,因为文件在切割还是那么大。
2.上传后, 异步解压缩。
3. 实际上300个节目不值得用多线程处理, 因为瓶颈很可能在数据库插入那块, 所以这块可以一次读入后, 使用batch insert到数据库中。

qq_20766085
huhuhuhr 和我实现最接近,分拿好,谢谢哦
一年多之前 回复

后端用poi解析excel,图片名称和excel有一个相同且不重复的名称,如果不要求实时的话只要认证图片名称和界面名称一一对应,就返回确认消息。然后起一条线程,做解压图片,解压完成后将图片名称和解析出来的记录一一对应

whb3299065
whb3299065 回复线上幼龄: 没办法,文件上传肯定非常耗时间的,就算这里你用分布式文件系统,上传速度还是会受到客户端传输带宽的限制,你观察优酷之类的上传视频不也得等很久嘛,这个地方没办法用技术手段提升速度,你可以从业务的角度设计一下,能不能把2g变小
一年多之前 回复
qq_20766085
huhuhuhr 我一次http请求要做三百条节目的落值工作的。难点是内存估计受不了2g的图片;2个g的文件估计要上传一会的
一年多之前 回复

我一次http请求要做三百条节目的落值工作的。难点是内存估计受不了2g的图片;2个g的文件估计要上传一会的。

whb3299065
whb3299065 上传文件是边读边写,并不是一次性读取完成才写入到硬盘
一年多之前 回复

1、图片直接存在服务器,然后解压就行
2、解析excel,将所有节目录入数据库
3、根据上传的图片名称和数据库中的节目 更新表数据做映射关系。

图片直接上传到服务器或者tomcat的指定目录,excel里每航节目和图片文件名称或者路径设立一个对应关系,解析excel,读取相对或者指定路径的文件,
这问题其实很简单,根本都不需要使用多线程

后台搭建ftp服务器,或webuploader分片上传。
服务器可以解压出照片,分条处理excel。

public static boolean readExcel(String filePath){
boolean success=false;
Workbook rwb = null;
try{
InputStream is = new FileInputStream(filePath);
rwb = Workbook.getWorkbook(is);
// 获取第一张Sheet表
Sheet rs = rwb.getSheet(0);
for (int k = 1; k < rs.getRows(); k++){
String major=rs.getCell(0, k).getContents();
String year=rs.getCell(1, k).getContents();
String class1=rs.getCell(2, k).getContents();
String number1=rs.getCell(3, k).getContents();
String name=rs.getCell(4, k).getContents();
String sex=rs.getCell(5, k).getContents();
String people=rs.getCell(6, k).getContents();
String area=rs.getCell(7, k).getContents();
String birth=rs.getCell(8, k).getContents();
String bodyid=rs.getCell(9, k).getContents();
String phone=rs.getCell(10, k).getContents();
String hostel=rs.getCell(11, k).getContents();
String father=rs.getCell(12, k).getContents();
String mather=rs.getCell(13, k).getContents();
String tel=rs.getCell(14, k).getContents();
String studentstate=rs.getCell(15, k).getContents();
String level1=rs.getCell(16, k).getContents();
String party=rs.getCell(17, k).getContents();
String duties=rs.getCell(18, k).getContents();
String english=rs.getCell(19, k).getContents();
String computer=rs.getCell(20, k).getContents();
String address=rs.getCell(21, k).getContents();
String personstation=rs.getCell(22, k).getContents();
String fundingstation=rs.getCell(23, k).getContents();
String awardstation=rs.getCell(24, k).getContents();
String punishmentstation=rs.getCell(25, k).getContents();
String other1=rs.getCell(26, k).getContents();
String picturepath="";
if(major.equals("")||class1.equals("")||name.equals("")||number1.equals("")){
success=false;
break;
}else{
String str1="insert into information(major,year,class1,number1,name,sex,people,area,birth,bodyid,phone,hostel,father,mather,tel,studentstate,level1,party,duties,english,computer,address,personstation,fundingstation,awardstation,punishmentstation,other1,picturepath)values('"+major+"','"+year+"','"+class1+"','"+number1+"','"+name+"','"+sex+"','"+people+"','"+area+"','"+birth+"','"+bodyid+"','"+phone+"','"+hostel+"','"+father+"','"+mather+"','"+tel+"','"+studentstate+"','"+level1+"','"+party+"','"+duties+"','"+english+"','"+computer+"','"+address+"','"+personstation+"','"+fundingstation+"','"+awardstation+"','"+punishmentstation+"','"+other1+"','"+picturepath+"')";
CommonCode.addInfo(str1);
CommonCode.closeAll();
success=true;
}
}
rwb.close();
}catch (Exception e){
e.printStackTrace();
}
return success;
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!