springboot项目如何实现文件上传和下载

  我们先说一下文件上传。什么是文件上传呢?文件上传就是将本地的文件以流的形式写入到服务器的过程。
  如何要实现文件上传,我们必须要实现三大要素。
  1、表单提交的方式必须是post。因为get方法提交的数据有容量的限制,而且最大也只有几KB。而post方式没有数据大小容量的限制。
  2、表单中选择文件的按钮,必须要赋予name属性值。
  3、表单的enctype属性要改为multipart/form-data。不修改的话,只会上传文件的名字,不会上传文件的内容。
  下面就是我实现文件上传的小demo。
  UploadController类代码

package com.load.controller;

import com.load.utils.StringUtils;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;

/**
 * 这是一个文件上传的demo
 */
@Controller
@ResponseBody
public class UploadController {
    @PostMapping("/up")
    public void accept(MultipartFile upload) {
        //判断文件是否为空
        if(upload.isEmpty()!=true){
            //获得文件名
            String name=upload.getOriginalFilename();
            //对文件名进行加工
            String filename=StringUtils.add(name);
            //获得目标文件夹路径
            ApplicationHome app=new ApplicationHome(getClass());
            String dirpath=app.getSource().getParentFile().toString();
            String filepath=dirpath+"\\classes\\upload\\";
            File dest=new File(filepath+filename);
            try {
                //保存文件
                upload.transferTo(dest);
                System.out.println("上传成功");
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("上传失败");
            }
        }
        else {
            System.out.println("上传文件为空!");
        }
    }
}

  StringUtils类

package com.load.utils;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/***
 * 对上传的文件的名字进行加工
 */
public class StringUtils {
    public static String add(String str){
        System.out.println(str);
        String name[]=str.split("\\.");
        System.out.println(Arrays.toString(name));
        Date date=new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
        String filename=name[0]+"-"+sdf.format(date)+"."+name[1];
        return filename;
    }
}

  上传网页代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post" action="/up" enctype="multipart/form-data">
        <input type="file" name="upload">
        <br/>
        <input type="submit" value="上传">
    </form>
</body>
</html>

  下面我们说一下,什么是文件下载?
  文件下载就是把服务器端的文件以流的形式写入到客户端上。
  要实现文件下载,主要是实现以下三个步骤:
  1、要设置文件的MIME类型,不同的文件的MIME类型也不一样。我们可以通过ServletContext的getMimeType方法来获得文件的MIME类型。
  2、要设置response的Content-Disposition头信息,设置下载文件的文件名。
  3、最后将response的输入流和下载文件的输入流进行对接。
  下面就是我实现文件下载的小demo。
  DownloadController类

package com.load.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

@Controller
public class DownloadController {

    @RequestMapping("/download")
    @ResponseBody
    public void download(HttpServletRequest request,HttpServletResponse response) {
        //要上传的文件名字
        String fileName = "water.jpg";
        //通过文件的保存文件夹路径加上文件的名字来获得文件
        String FILE_DIR="src\\main\\resources\\download";
        File file = new File(FILE_DIR, fileName);
        //当文件存在
        if (file.exists()) {
            //首先设置响应的内容格式是force-download,那么你一旦点击下载按钮就会自动下载文件了
            String type=request.getServletContext().getMimeType(fileName);
            response.setContentType(type);
            //通过设置头信息给文件命名,也即是,在前端,文件流被接受完还原成原文件的时候会以你传递的文件名来命名
            response.addHeader("Content-Disposition","attachment; filename="+file.getName());
            //进行读写操作
            byte[] buffer = new byte[1024];
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                OutputStream os = response.getOutputStream();
                //从源文件中读
                int i = bis.read(buffer);
                while (i != -1) {
                    //写到response的输出流中
                    os.write(buffer, 0, i);
                    i = bis.read(buffer);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //善后工作,关闭各种流
                try {
                    if (bis != null) {
                        bis.close();
                    }
                    if (fis != null) {
                        fis.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        else {
            System.out.println("文件不存在!");
        }
    }
}

  下载网页代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
water.jpg图片下载<br/>
<a href="/download">下载</a>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/hailongcsdn/article/details/106261623