Java实现上传和下载功能

Idea、SpringBoot、Maven

本文参考:https://blog.csdn.net/weixin_43160956/article/details/84675286

1.添加依赖

<!--        文件上传和下载-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

2.创建一个类

package com.example.demo1.FileUpDo;

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;

@RestController
@RequestMapping("/file")
public class FileUploadAndDownload {
    
    

//    定义文件存放的父文件夹路径
    private static String parentPath = "D:\\L"+ File.separator+"fileUpload";

    @RequestMapping("/upload")
    public String upload(){
    
    
        return "upload";
    }

    @RequestMapping(value = "/upload",method = RequestMethod.POST)
    @ResponseBody
    public String upload(@RequestParam("file")MultipartFile file){
    
    
        if (file.isEmpty()){
    
    
            return "上传失败";
        }else{
    
    
//          获取文件原名
            String originalFilename = file.getOriginalFilename();

//          获取源文件前缀
            String fileNamePrefix = originalFilename.substring(0,originalFilename.lastIndexOf("."));

//          获取源文件后缀
            String fileNameSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));

//          将源文件前缀之后加上时间戳避免重名
            String newFileNamePrefix = fileNamePrefix+new Date().getTime();

//          得到上传后新文件的文件名
            String newFileName = newFileNamePrefix+fileNameSuffix;

//          创建一个新的File对象用于存放上传的文件
            File fileNew = new File(parentPath+File.separator+newFileName);
            try {
    
    
                file.transferTo(fileNew);
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
        return "上传成功";
    }

    @RequestMapping(value = "/download",method = RequestMethod.GET)
    public void download(HttpServletResponse response){
    
    
//        通过response输出流将文件传递到浏览器
//        1、获取文件路径
        String fileName = "新建 DOCX 文档1603442822260.docx";

//        接受参数中添加一个filename参数(文件名)
//        String fileName = filename;

//      2.构建一个文件通过Paths工具类获取一个Path对象
        Path path = Paths.get(parentPath,fileName);

//      判断文件是否存在
        if (Files.exists(path)){
    
    
//          存在则下载
//            通过response设定他的响应类型
//            4.获取文件的后缀名
            String fileSuffix = fileName.substring(fileName.lastIndexOf(".")+1);

//            5.设置contentType ,只有指定contentType才能下载
            response.setContentType("application/"+fileSuffix);

//            6.添加http头信息
//            因为fileName的编码格式是UTF-8 但是http头信息只识别 ISO8859-1 的编码格式
//            因此要对fileName重新编码
            try {
    
    
                response.addHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes("UTF-8"),"ISO8859-1"));
            } catch (UnsupportedEncodingException e) {
    
    
                e.printStackTrace();
            }
//            7.使用  Path 和response输出流将文件输出到浏览器
            try {
    
    
                Files.copy(path,response.getOutputStream());
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

本文参考:https://blog.csdn.net/weixin_43160956/article/details/84675286

猜你喜欢

转载自blog.csdn.net/MYNAMEL/article/details/109468427