时间: 2020-09-8|74次围观|0 条评论

从.Net到Java学习系列目录

图片上传

Spring Boot中的文件上传就是Spring MVC中的文件上传,将其集成进来了。

在模板目录创建一个新的页面 profile/uploadPage.html

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head>    <meta charset="UTF-8"/>    <title>Title</title></head><body><h2 class="indigo-text center">Upload</h2><form th:action="@{/upload}" method="post" enctype="multipart/form-data" class="col m8 s12 offset-m2">    <div class="input-field col s6">        <input type="file" id="file" name="file"/>    </div>    <div class="col s6 center">        <button class="btn indigo waves-effect waves-light"                type="submit" name="save" >Submit            <i class="mdi-content-send right"></i>        </button>    </div>    <div class="col s12 center red-text" th:text="${error}" th:if="${error}">        Error during upload    </div>    <div class="col m8 s12 offset-m2">        <img th:src="@{${picturePath}}" width="100" height="100"/>    </div></form></body></html>

除了表单中的 enctype 属性以外,并没有太多值得关注的。文件将会通过 POST 方法发送到 upload URL 上,新建控制器PictureUploadController

@Controller@SessionAttributes("picturePath")public class PictureUploadController {    //跳转到上传文件的页面    @RequestMapping("upload")    public String uploadPage() {        return "profile/uploadPage";    }    //处理文件上传    @RequestMapping(value = "/upload", method = RequestMethod.POST)    public String onUpload(MultipartFile file, HttpServletRequest request, RedirectAttributes redirectAttrs, Model model) throws IOException {        if (file.isEmpty() || !isImage(file)) {            redirectAttrs.addFlashAttribute("error", "Incorrect file.Please upload a picture.");            return "redirect:/upload";        }        String filePath =  request.getSession().getServletContext().getRealPath("pictures/");        Resource picturePath = copyFileToPictures(file,filePath);        String _path="/pictures/"+picturePath.getFilename();        model.addAttribute("picturePath",_path);        return "profile/uploadPage";    }    private Resource copyFileToPictures(MultipartFile file,String filePath) throws IOException {        String filename = file.getOriginalFilename();        File tempFile = File.createTempFile("pic",                getFileExtension(filename),  new FileSystemResource(filePath).getFile());        try (InputStream in = file.getInputStream();             OutputStream out = new FileOutputStream(tempFile)) {            IOUtils.copy(in, out);        }        return new FileSystemResource(tempFile);    }    //判断上传文件的类型是否是图片    private boolean isImage(MultipartFile file) {        return file.getContentType().startsWith("image");    }    //获取上传文件的扩展名    private static String getFileExtension(String name) {        return name.substring(name.lastIndexOf("."));    }}

在项目的根目录下创建 pictures 目录 ,上述代码做的第一件事情是在 pictures 目录下创建一个临时文件,这个目录位于项目的根文件夹下,所以要确保该目录是存在的。在 Java 中,临时文件只是用来获取文件系统中唯一的文件标识符的,用户可以自行决定是否要删除它 。用户提交的文件将会以 MultipartFile 接口的形式注入到控制器中,这个接口提供了多个方法,用来获取文件的名称、大小及其内容 。try...with 代码块将会自动关闭流,即便出现异常也会如此,从而移除了finally 这样的样板式代码 。我们还可以定义上传文件的功能。

  • multipart.maxFileSize:这定义了所允许上传文件的最大容量。尝试上传更大的文件将会出现 MultipartException,其默认值是 1Mb
  • multipart.maxRequestSize:这定义了整个 multipart 请求的最大容量,默认值10MB

从.Net到Java学习第十篇——Spring Boot文件上传和下载插图

运行预览:

从.Net到Java学习第十篇——Spring Boot文件上传和下载插图1

图片下载

修改控制器PictureUploadController,添加如下代码:

   //图片下载    @RequestMapping(value = "/DownloadPic", method = RequestMethod.GET)    public void Download(HttpServletRequest req,HttpServletResponse res) {        String fileName = "pic2456280610589533697.jpg";        res.setHeader("content-type", "application/octet-stream");        res.setContentType("application/octet-stream");        res.setHeader("Content-Disposition", "attachment;filename=" + fileName);        byte[] buff = new byte[1024];        BufferedInputStream bis = null;        OutputStream os = null;        try {            os = res.getOutputStream();            String filePath =  req.getSession().getServletContext().getRealPath("pictures/");            bis = new BufferedInputStream(new FileInputStream(new File(filePath + fileName)));            int i = bis.read(buff);            while (i != -1) {                os.write(buff, 0, buff.length);                os.flush();                i = bis.read(buff);            }        } catch (IOException e) {            e.printStackTrace();        } finally {            if (bis != null) {                try {                    bis.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        System.out.println("success");    }

修改uploadPage.html,添加:

    <a href="/DownloadPic">下载图片</a>

从.Net到Java学习第十篇——Spring Boot文件上传和下载插图2

文章转载于:https://www.cnblogs.com/jiekzou/p/9229373.html

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《从.Net到Java学习第十篇——Spring Boot文件上传和下载
   

还没有人抢沙发呢~