数据库表保存图片
数据库保存图片
·
实现图片保存
图片是软件建设必不可少的保存信息之一,如何合适保存图片下面介绍两种方式。一种通过阿帕奇组件处理前端的图片,另一种是通过request实现前端传来的文件。
一、前端jsp实现from表单
<form method="post" action="upload" class="pageForm required-validate" enctype="multipart/form-data" type='ewForm' size="{th:'25%'}" >
<div class="pageFormContent" layoutH="0">
<div class="ew-c-globalForm-content">
<input type="file" name="importExcel" id="importExcel" multiple="multiple"/>
</div>
<input type="submit" caption="文件或者图片上传" >
<input class="close" type="button" caption="关闭" value="关闭">
</div>
</form>
multiple实现的是多文件,多图片上传
二、java代码
public IZrarResponse saveImportData(IZrarRequest req) throws Exception{
IZrarResponse res = new ZrarResponse();
String savePath = "D:\\";
// 使用Apache文件上传组件处理文件上传步骤:
// 1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 2、创建一个文件上传解析器
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
// 解决上传文件名的中文乱码
fileUpload.setHeaderEncoding("UTF-8");
// 3、判断提交上来的数据是否是上传表单的数据
if (!fileUpload.isMultipartContent(req.getHttpServletRequest())) {
// 按照传统方式获取数据
return null;
}
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> fileItems = fileUpload.parseRequest(req.getHttpServletRequest());
//赋值
for (FileItem item : fileItems) {
//附件表主键
String md5Id = (new StringBuilder(String.valueOf(System.currentTimeMillis()))).toString();
// 如果fileitem中封装的是上传文件,得到上传的文件名称,
String fileName = item.getName();
System.out.println(fileName);
if (fileName == null || fileName.trim().equals("")) {
continue;
}
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
// c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
// 获取item中的上传文件的输入流
InputStream inputStream = item.getInputStream();
//创建一个文件输出流
FileOutputStream out = new FileOutputStream(savePath + "\\" + fileName);
//创建一个缓冲区
byte buffer[] = new byte[1024];
//判断输入流中的数据是否已经读完的标识
int len = 0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((len=inputStream.read(buffer))>0){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
out.write(buffer, 0, len);
}
//关闭输入流
inputStream.close();
//关闭输出流
out.close();
//删除处理文件上传时生成的临时文件
item.delete();
}
return res;
}
三、文件路径保存到数据库
这时候调用修改表的函数进行表修改
update stu set photo=? where sno=?
这样完成图片或者文件的上传
第二种实现方式:
1.
<form action="/xx/file" method="post" enctype="multipart/form-data">
<input type="intro" name="intro" /><br />
<input type="file" name="filelist" /><br />
<input type="file" name="filelist" /><br />
<input type="file" name="filelist" /><br />
<input type="submit" value="提交"/><br />
</form>
2.controller处理前端form表单给的数据
@RequestMapping("/file")
public ModelAndView file(HttpServletRequest request) {
//获取参数
String intro = request.getParameter("intro");
//保存文件
HttpServletFileUtil.getFileJon(request);
return new ModelAndView();
}
3.处理文件或者图片
public class HttpServletFileUtil {
//系统内存的地址
private static String FILEPATH_SYS = "";
//服务器存放文件地址
private static String FILEPATH = "";
public static String getFileJon(HttpServletRequest request) {
//文件名,多文件中间使用,号隔开,或直接存为数组,根据业务更改
String fileJon = "";
if (request instanceof MultipartHttpServletRequest) {
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
List<MultipartFile> files = multipartHttpServletRequest.getFiles("filelist");
Iterator<MultipartFile> iterator = files.iterator();
while (iterator.hasNext()) {
MultipartFile file = iterator.next();
if (file != null && file.getSize() > 0) {
try {
//获取文件后缀
// String filename = file.getContentType().substring(file.getContentType().lastIndexOf("/")).substring(1);
//文件名
String filedes = StringUtils.join(UUID.randomUUID().toString().replace("-", "") + ".jpg");
//获取文件路径信息 保存文件用的地址
String filepath = StringUtils.join(FILEPATH + filedes);
//系统内保存用的
String filepathSys = StringUtils.join(FILEPATH_SYS + filedes);
//多文件地址存数据库,地址中间,号隔开
if (StringUtils.isBlank(fileJon)) {
fileJon = StringUtils.join(fileJon, filepathSys);
} else {
fileJon = StringUtils.join(fileJon + ",", filepathSys);
}
File sa = new File(filepath);
file.transferTo(sa);
} catch (IOException e) {
e.printStackTrace();
}
}
}
} else {
throw new Exception("相关图片不能为空");
}
return fileJon;
}
}
总结
数据库图片的处理有很多种。有直接在数据库表通过二进制实现图片的保存,有的是通过java代码实现图片保存,本文是通过保存图片路径的方式实现前端传来的数据。这种优点是能够减少数据库的压力,但是网站发布一定要创建相关文件保存信息。关于java代码的处理过程冗余,后续应该简单的实现文件保存到指定文件夹并调用数据库函数,实现路径的修改。图片的处理对于程序员来讲应该备份很多模板代码。
更多推荐
已为社区贡献1条内容
所有评论(0)