zoukankan      html  css  js  c++  java
  • springboot-17-springboot的文件上传和下载

    单文件上传

    1, 需要使用thymeleaf模板:  http://www.cnblogs.com/wenbronk/p/6565834.html

    src/main/resource/template/file.html

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
        <head>
            <title>Hello World!</title>
        </head>
        <body>
           <form method="POST" enctype="multipart/form-data" action="/upload"> 
               <p>文件:<input type="file" name="file" /></p>
               <p><input type="submit" value="上传" /></p>
           </form>
        </body>
    </html>

    文件上传方法

    package com.iwhere.main.controller;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.List;
    import java.util.UUID;
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.multipart.MultipartHttpServletRequest;
    
    /**
     * 文件上传controller
     * 
     * @RestController 相当于同时 @Controller和@ResponseBody两个注解
     * 
     * @author wenbronk
     * @time 2017年4月6日 下午2:43:03 2017
     */
    @RestController
    public class FileUploadController {
    
        /**
         * 文件上传
         * 
         * @return
         */
        @RequestMapping(value = "/upload", method = RequestMethod.POST)
        public String handlFileUpload(@RequestParam("file") MultipartFile file) {
    
            if (file.isEmpty()) {
                return "文件是空的";
            }
    
            // 读取文件内容并写入 指定目录中
            String fileName = file.getOriginalFilename();
            // String suffixName = fileName.substring(fileName.lastIndexOf("."));
            fileName = UUID.randomUUID() + "|+=|-|" + fileName;
    
            File dest = new File("E:/test/" + fileName);
            // 判断目录是否存在
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
    
            try {
                file.transferTo(dest);
            } catch (IOException e) {
                return "后台也不知道为什么, 反正就是上传失败了";
            }
            return "上传成功";
        }
    }

    多文件上传:

    1, thymeleaf

    src/main/resource/template/multifile.html

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
        <head>
            <title>Hello World!</title>
        </head>
        <body>
           <form method="POST" enctype="multipart/form-data" action="/batch/upload"> 
               <p>文件1:<input type="file" name="file" /></p>
               <p>文件2:<input type="file" name="file" /></p>
               <p>文件3:<input type="file" name="file" /></p>
               <p><input type="submit" value="上传" /></p>
           </form>
        </body>
    </html>

    2, 多文件上传方法

        /**
         * 多文件上传
         * 类似单文件上传, 遍历
         * @return
         */
        @RequestMapping(value = "multiUpload", method = RequestMethod.POST)
        public String handleMultiFileupload(HttpServletRequest request) {
            List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
    
            for (MultipartFile multipartFile : files) {
                if (multipartFile.isEmpty()) {
                    return "文件是空的";
                }
    
                // 读取文件内容并写入 指定目录中
                String fileName = multipartFile.getOriginalFilename();
                // String suffixName =
                // fileName.substring(fileName.lastIndexOf("."));
                fileName = UUID.randomUUID() + "|+=|-|" + fileName;
    
                File dest = new File("E:/test/" + fileName);
                // 判断目录是否存在
                if (!dest.getParentFile().exists()) {
                    dest.getParentFile().mkdirs();
                }
    
                try {
                    multipartFile.transferTo(dest);
                } catch (IOException e) {
                    return "后台也不知道为什么, 反正就是上传失败了";
                }
            }
            return "上传成功";
        }

    文件下载

    /**
         * 文件下载
         * 
         * @return
         */
        @RequestMapping("/download")
        public String downLoadFile(HttpServletRequest request, HttpServletResponse response) {
            // 文件名可以从request中获取, 这儿为方便, 写死了
            String fileName = "rtsch_ex.json";
            // String path = request.getServletContext().getRealPath("/");
            String path = "E:/test";
            File file = new File(path, fileName);
    
            if (file.exists()) {
                // 设置强制下载打开
                response.setContentType("application/force-download");
                // 文件名乱码, 使用new String() 进行反编码
                response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
    
                // 读取文件
                BufferedInputStream bi = null;
                try {
                    byte[] buffer = new byte[1024];
                    bi = new BufferedInputStream(new FileInputStream(new File("")));
                    ServletOutputStream outputStream = response.getOutputStream();
                    int i = -1;
                    while (-1 != (i = bi.read(buffer))) {
                        outputStream.write(buffer, 0, i);
                    }
                    return "下载成功";
                } catch (Exception e) {
                    return "程序猿真不知道为什么, 反正就是下载失败了";
                } finally {
                    if (bi != null) {
                        try {
                            bi.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            return "文件不存在";
        }

    文件下载时, 最容易出现文件名乱码的问题, 这儿使用new String() 进行反编码, 

    String downname = new String(filename.getBytes("gbk"),"iso8859-1");

    当然还有个不太稳的方法: 

    URLEncoder.encode(fileName, "UTF-8"));  

    还有一种, 不太奏效  

  • 相关阅读:
    Sagit.Framework For IOS 自动布局教程:14、UIScrollView 特殊用法
    Sagit.Framework For IOS 自动布局教程:13、UIImage、UIImageView 图片压缩、(长按)保存、缩放、(列表)放大浏览、生成验证码。
    Sagit.Framework For IOS 自动布局教程:12、UIButton、UILabel、UITextField、UITextView 特殊用法介绍
    Sagit.Framework For IOS 自动布局教程:10、获取px的宽高坐标、元素移动、刷新布局、自适应大小、聊天消息背景图片拉伸。
    Sagit.Framework For IOS 自动布局教程:11、常用宏定义:frame坐标系、获取UI、UI取值、字体颜色、图片
    Sagit.Framework For IOS 自动布局教程:7、底部Tab栏
    Sagit.Framework For IOS 自动布局教程:8、UIView通用事件:点击、双击、长按、拖动、滑动。
    Sagit.Framework For IOS 自动布局教程:9、UI元素的类型转换as
    Sagit.Framework For IOS 自动布局教程:6、导航栏
    Sagit.Framework For IOS 自动布局教程:5、状态栏
  • 原文地址:https://www.cnblogs.com/wenbronk/p/6674048.html
Copyright © 2011-2022 走看看