文章目录

  • 实现图片保存
  • 一、前端jsp实现from表单
  • 二、后端java实现文件保存
  • 路径保存到数据库
  • 总结


实现图片保存

图片是软件建设必不可少的保存信息之一,如何合适保存图片下面介绍两种方式。一种通过阿帕奇组件处理前端的图片,另一种是通过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代码的处理过程冗余,后续应该简单的实现文件保存到指定文件夹并调用数据库函数,实现路径的修改。图片的处理对于程序员来讲应该备份很多模板代码。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐