- 环境
数据库里图片的字段用mediumblob类型,可直接存储二进制文件
导出需要用到apache-ant-zip.jar包,用于压缩文件夹,如果用java自带的会乱码,所以使用apache的包
导入图片后端代码
作者只写了后端的代码~~前端传base64编码格式的内容!由于框架原因,还是使用servlet实现
public class ChfpClassServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = -2483096664722616128L;
@Autowired
private ChfpClassService chfpClassService;
private Logger log = LoggerFactory.getLogger(ChfpClassServlet.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
public void init() throws ServletException {
chfpClassService = Dispatcher.getBean("chfpClassService");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String arg = req.getParameter("arg");
if (arg.equals("image")) {
// ServletInputStream data = req.getInputStream();
String ret = null;
log.info("imageServlet");
try {
byte[] data = FileServlet.readInputStream(req.getInputStream());
String dataStr = new String(data, "utf-8");
Map map = null;
try {
map = JSONObject.parseObject(dataStr);
} catch (JSONException e) {
// TODO: handle exception
log.error(e.getMessage());
return;
}
String base64 = (String) map.get("base64");
base64 = base64.replace("data:image/jpeg;base64,", "");
String mobile = (String) map.get("mobile");
String imgName = (String) map.get("imgName");
String signdate = (String) map.get("signdate");
byte[] bytes = Base64.decodeFast(base64);
// System.out.println(bytes.length);
Map<String, Object> maps = new HashMap<String, Object>();
maps.put(imgName, bytes);
maps.put("mobile", mobile);
maps.put("signdate", signdate);
chfpClassService.updateImg(maps);
ret = "{\"result\":0,\"msg\":\"上传成功!\"}";
ITxnoCache c = Dispatcher.getBean("fileTxnoCache");
List keyList = new ArrayList<String>();
int accid = chfpClassService.queryMobileId(mobile);
String key = String.format("%s=%s=null=null=null", imgName,
accid + "");
// System.out.println(key);
keyList.add(key);
c.clear(keyList);
// TODO:清除其他兄弟服务器
// System.out.println("上传成功");
} catch (Exception e) {
e.printStackTrace();
ret = "{\"result\":1,\"msg\":\"上传失败!\"}";
} finally {
if (ret != null) {
try {
PrintWriter writer = resp.getWriter();
writer.write(ret.toCharArray());
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
web.xml里的片段
<servlet>
<servlet-name>ChfpClassServlet</servlet-name>
<servlet-class>com.wealth.control.servlet.ChfpClassServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ChfpClassServlet</servlet-name>
<url-pattern>/chfpClass</url-pattern>
</servlet-mapping>
后台实现导入图片就是这么简单!
前后端实现导出图片到压缩文件夹
- servlet代码,初始化过service,为了能使用事务,记得ZipOutputStream 和ZipEntry要用apache的包(org.apache.tools.zip),生成的结果会截断*String fileName=String.format("%s%s%s\%s_%s",map2.get(“CNAME”),map2.get(“PATCH”),map2.get(“BATCH”),map2.get(“MOBILE”),map2.get(“CNAME”));*设置的文件名,注意是两条\
public class ChfpImgServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = -4885164503517411305L;
@Autowired
private ChfpClassService chfpClassService;
private Logger log = LoggerFactory.getLogger(ChfpImgServlet.class);
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//String ret = null;
log.info("imageExport");
try {
String dataStr=req.getParameter("idlist");
List<Object> list=null;
try {
list = JSONArray.parseArray(dataStr);
} catch (JSONException e) {
// TODO: handle exception
log.error(e.getMessage());
return;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String downFileName = "未命名";
try {
downFileName = (new String(("CHFP图片列表"+sdf.format(new Date())).getBytes("gbk"),"iso-8859-1")) +".rar";
} catch (UnsupportedEncodingException e1) {
}
resp.setHeader("Content-Disposition", "attachment;filename="+ downFileName);
resp.setContentType("application/octet-stream;charset=UTF-8");
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Cache-Control", "no-cache");
resp.setDateHeader("Expires", 0);
ZipOutputStream out=new ZipOutputStream(resp.getOutputStream());
List<Map<String, Object>> lists=chfpClassService.queryExcelChfp(ResultUtils.makeQueryMap("list",list));
for (Map<String, Object> map2 : lists) {
String fileName=String.format("%s%s%s\\%s_%s",map2.get("CNAME"),map2.get("PATCH"),map2.get("BATCH"),map2.get("MOBILE"),map2.get("CNAME"));
byte[] idcard_a=(byte[]) map2.get("IDCARD_A");
byte[] idcard_b=(byte[]) map2.get("IDCARD_B");
byte[] headphoto=(byte[]) map2.get("HEADPHOTO");
byte[] certif=(byte[]) map2.get("CERTIF");
byte[] educ=(byte[]) map2.get("EDUC");
byte[][] bytes={idcard_a,idcard_b,headphoto,certif,educ};
zipChfpFiles(out, bytes, fileName);
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void zipChfpFiles(ZipOutputStream out,byte[][] data,String fullFileName){
String[] typeNames = {"身份证A面","身份证B面","证件照"," 培训合格证","学历"};//导出的照片名
try {
for(int i=0;i<data.length;i++){
if(data[i]==null || data[i].length==0){
continue;
}
InputStream in=new ByteArrayInputStream(data[i]);
String filename = fullFileName+typeNames[i]+".jpg";
//filename=new String(filename.getBytes("utf-8"),"gbk");
out.putNextEntry(new ZipEntry(filename));
out.setEncoding("gbk");
//out.set
out.write(data[i]);
out.closeEntry();
in.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException
* if an error occurs
*/
public void init() throws ServletException {
// Put your code here
chfpClassService = Dispatcher.getBean("chfpClassService");
}
}
- html代码
<a id="export" class="nui-button" onclick="exportExcel1()">导出资料</a>
- js代码,功能是可多选导出的
function exportExcel1() {
var row = grid.getSelecteds();
if (row.length > 0) {
var bardate = row.map(function(x) {
return x.ACCID
});
var baseUrl = '../servlet/ChfpImgServlet';
handleExport(baseUrl, {
idlist : JSON.stringify(bardate)
});
} else {
$J.cap4jAlert("请选中一条记录", "提示");
}
}
function handleExport(url, queryParam) {
var downloadHelper = $(
'<iframe style="display:none;" id="downloadHelper"></iframe>')
.appendTo('body')[0];
var doc = downloadHelper.contentWindow.document;
if (doc) {
doc.open();
doc.write('');//微软为doc.clear()有时会出bug
doc.writeln("<html><body><form id='downloadForm' name='downloadForm' method='post' action='"+ url+"'>");
//const queryParam = this.listQuery;
for (key in queryParam) {
doc.writeln("<input type='hidden' name='"+key+"' value='"+queryParam[key]+"'>");
}
doc.writeln('<\/form><\/body><\html>');
doc.close();
const
form = doc.forms[0];
if (form) {
form.submit();
}
}
}
- mabatis.xml内容
<select id="queryExcelChfp" resultType="map" >
select
cname,mobile,patch,batch,idcard_a,idcard_b,headphoto,certif,educ from
activitydb.fin2_act3_chfp_class as cc where accid in (
<foreach collection="list" separator="," index="index" item="item">
#{item}
</foreach>)
</select>
- web.xml
<servlet>
<servlet-name>ChfpImgServlet</servlet-name>
<servlet-class>com.wealth.control.servlet.ChfpImgServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ChfpImgServlet</servlet-name>
<url-pattern>/servlet/ChfpImgServlet</url-pattern>
</servlet-mapping>
- 实现效果图:
嗯,不乱码还是很不错的!设置了如果选择的内容没有图片,就跳过导出这个用户
开发中一般使用map传参数,不怎么需要实现类,map也非常方便,但是报错时无法快速定位到bug,还有就是二维数组了,下面加一段代码,看是否有人会需要:
二维数组更换指定列到指定位置上:
f1是目标位置,f2是指定列,从0开始数,不过有个小BUG,f2必须大于f1
public String[][] swap(String[][] data,int f1,int f2){
for (int i = 0; i < data.length; i++) {
String tamp=data[i][f2];
for (int j = f2; j >f1; j--) {
data[i][j]=data[i][j-1];
}
data[i][f1]=tamp;
}
return data;
}