文件上传下载and图片上传及前台显示
之前感觉图片上传下载不就是通过流的形式么,最近做起来还真是棘手啊,所以说有的是就得先做后想才对。
大体思路:把把图片存到文件夹中,然后把图片的名字存入数据库中。因公司用的Spring框架,所以只用Spring框架完成了上传,之后改变了方法完成的上传及前台显示,还是把网上找的Spring的上传下载贴出来,估计以后用得上,下载没有亲测~~
Spring上传:
springmvc.xml必须配置:1.
<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8"/>
2.WEB-INF/lib下必加入:commons-fileupload.jar与commons-io-1.4.jar二个包
3.提交的form表单中属性加: enctype="multipart/form-data"
单文件上传(以下为三种方法,第二种亲测):
@Controller public class FileUploadController { @RequestMapping(value = "/upload", method = RequestMethod.POST) public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest .getFile("file"); String name = multipartRequest.getParameter("name"); System.out.println("name: " + name); // 获得文件名: String realFileName = file.getOriginalFilename(); System.out.println("获得文件名:" + realFileName); // 获取路径 String ctxPath = request.getSession().getServletContext().getRealPath( "/") + "images/"; // 创建文件 File dirPath = new File(ctxPath); if (!dirPath.exists()) { dirPath.mkdir(); } File uploadFile = new File(ctxPath + realFileName); FileCopyUtils.copy(file.getBytes(), uploadFile); request.setAttribute("files", loadFiles(request)); return new ModelAndView("success"); } @RequestMapping(value = "/upload2", method = RequestMethod.POST) public ModelAndView onSubmit2(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception { // 转型为MultipartHttpRequest MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; // 根据前台的name名称得到上传的文件 MultipartFile file = multipartRequest.getFile("file"); // 获得文件名: String realFileName = file.getOriginalFilename(); // 获取路径 String ctxPath = request.getSession().getServletContext().getRealPath( "/") + "\\" + "images\\"; // 创建文件 File dirPath = new File(ctxPath); if (!dirPath.exists()) { dirPath.mkdir(); } File uploadFile = new File(ctxPath + realFileName); FileCopyUtils.copy(file.getBytes(), uploadFile); request.setAttribute("files", loadFiles(request)); return new ModelAndView("success"); } @RequestMapping(value = "/upload3", method = RequestMethod.POST) public String upload(@RequestParam("file") MultipartFile image, HttpServletRequest request) throws IOException { String ctxPath = request.getSession().getServletContext().getRealPath( "/") + "\\" + "images\\"; System.out.println("路径:" + ctxPath); File file = new File(ctxPath + "/" + image.getOriginalFilename()); // FileCopyUtils.copy(image.getBytes(),new // File(ctxPath+"/"+image.getOriginalFilename())); try { image.transferTo(file); // 保存上传的文件 } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } request.setAttribute("files", loadFiles(request)); return "success"; }
多文件上传(没有亲自测试,不过同时参考以下代码写的):
// 多文件上传 @RequestMapping(value = "/upload4", method = RequestMethod.POST) public ModelAndView fileUpload(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); String ctxPath = request.getSession().getServletContext().getRealPath( "/") + "\\" + "images\\"; File file = new File(ctxPath); if (!file.exists()) { file.mkdir(); } String fileName = null; for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { // 上传文件名 // System.out.println("key: " + entity.getKey()); MultipartFile mf = entity.getValue(); fileName = mf.getOriginalFilename(); File uploadFile = new File(ctxPath + fileName); FileCopyUtils.copy(mf.getBytes(), uploadFile); } request.setAttribute("files", loadFiles(request)); return new ModelAndView("success"); } // @ModelAttribute("files")//此属性用于初始类时调用,但上传文件后不能时时反应上传文件个数,不适合动态数据 public List<String> loadFiles(HttpServletRequest request) { List<String> files = new ArrayList<String>(); String ctxPath = request.getSession().getServletContext().getRealPath( "/") + "\\" + "images\\"; File file = new File(ctxPath); if (file.exists()) { File[] fs = file.listFiles(); String fname = null; for (File f : fs) { fname = f.getName(); if (f.isFile()) { files.add(fname); } } } return files; }
文件下载:
@RequestMapping("/download/{fileName}") public ModelAndView download(@PathVariable("fileName") String fileName, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("UTF-8"); java.io.BufferedInputStream bis = null; java.io.BufferedOutputStream bos = null; String ctxPath = request.getSession().getServletContext().getRealPath( "/") + "\\" + "images\\"; String downLoadPath = ctxPath + fileName; System.out.println(downLoadPath); try { long fileLength = new File(downLoadPath).length(); response.setContentType("application/x-msdownload;"); response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1")); response.setHeader("Content-Length", String.valueOf(fileLength)); bis = new BufferedInputStream(new FileInputStream(downLoadPath)); bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (Exception e) { e.printStackTrace(); } finally { if (bis != null) bis.close(); if (bos != null) bos.close(); } return null; } }
spring.xml(必须配置)
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 自动搜索@Controller标注的类 用于指明系统从哪个路径下寻找controller,然后提前初始化这些对象。 --> <context:component-scan base-package="net.liuzd.web" /> <!-- ③:对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8"> <property name="maxUploadSize"> <value>104857600</value> </property> <property name="maxInMemorySize"> <value>4096</value> </property> </bean> </beans>
success.jsp
<%@ taglib prefix="c" uri="/WEB-INF/c.tld"%> <h1>Upload Successful</h1> <c:forEach var="month" items="${files}"> <li><a href="${pageContext.request.contextPath}/download/${month}.do">${month}</a></li> </c:forEach> <hr><br> <a href="${pageContext.request.contextPath}/index.jsp">返回</a>
web.xml(必须配置)
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/classes/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <context-param> <param-name>log4jExposeWebAppRoot</param-name> <param-value>false</param-value> </context-param> <listener> <listener-class> org.springframework.web.util.Log4jConfigListener </listener-class> </listener> <filter> <filter-name>encodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
================================================================================================================
以上有些没有亲自测试,以下为自己写的图片上传及前台显示
com.tayh.projectCenter.service.book.impl(BookServiceImpl)
/**上传图片 * @param request 内置对象 * @param response 内置对象 * @param user 用户类 * @param throws Exception 抛出异常 * @return * */ public void upload(HttpServletRequest request, HttpServletResponse response,@RequestParam(value = "file1", required = false) MultipartFile file , @ModelAttribute("book") com.tayh.projectCenter.vo.Book book){ //获取上传文件 if("".equals(file)||null==file){ //上传图片为空或null,不进行操作 }else{ //上传图片处理 String file_path=request.getRealPath("/")+"upload"; String file_real_file = "upload" + File.separator + "book" + File.separator; StringBuffer listFiles = new StringBuffer(); StringBuffer listFileNames = new StringBuffer(); if(!file.isEmpty()){ String fileName = file.getOriginalFilename(); System.out.println(fileName); File files = new File(file_path, fileName); if(!files.exists()){ files.mkdirs(); } if(!fileName.equals(null) && !"".equals(fileName)){ try { file.transferTo(files); } catch (Exception e) { e.printStackTrace(); } } listFiles.append(file_real_file + fileName + ","); listFileNames.append(fileName); } String f=listFileNames.toString(); book.setBookPic(f); } } /**将图片读到页面上 * @param request 内置对象 * @param response 内置对象 * @param throws Exception 抛出异常 * @return * */ public void dumpImage(HttpServletRequest request, HttpServletResponse response){ String paramPath = request.getParameter("path"); String path =""; if(paramPath == null){ path = (String) request.getAttribute("path"); }else{ try { path = new String(paramPath.getBytes("ISO8859-1"), "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } String picPath = request.getRealPath("/")+"upload"+ File.separator+path; InputStream in = null; BufferedInputStream bis = null; OutputStream out = null; BufferedOutputStream bos = null; // 判断文件是否存在 File file = new File(picPath); if (!file.exists() || file.isDirectory()){ return; } try { in = new FileInputStream(picPath); bis = new BufferedInputStream(in); byte[] data = new byte[1024]; int bytes = 0; out = response.getOutputStream(); bos = new BufferedOutputStream(out); while ((bytes = bis.read(data, 0, data.length)) != -1) { bos.write(data, 0, bytes); } bos.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (bos != null) bos.close(); if (out != null) out.close(); if (bis != null) bis.close(); if (in != null) in.close(); } catch (IOException e) { e.printStackTrace(); } } }
前台页面bookAdd.jsp
<TR height="20px"> <td align="center">图片上传</td> <td><input type="file" name="file1" id="file1" /></td> </TR>
前台接收borrowBook.jsp
<td> <img id="bookImage" src="dumpImage.do?path=${list.bookPic }" style="height:120px;width:100px;" /> </td>