Spring文件上传下载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>


以上有些没有亲自测试,以下为自己写的图片上传及前台显示

/**上传图片
     * @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>

文章来源:点击打开链接

相关推荐