文件上传和下载

文章目录

  • Controller 层
  • Service 层
  • 入参实体

Controller 层

package cn.com.easyExcel.controller;

import cn.com.easyExcel.param.DownLoadParam;
import cn.com.easyExcel.service.FileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Api(tags = "文件")
@Slf4j
@RestController
@RequestMapping(value = "/file")
public class FileController {
    @Autowired
    private FileService fileService;
    
    @ApiOperation(value = "上传多个文件")
    @PostMapping(value="/uploadMoreFile", consumes="multipart/form-data")
    public String uploadMoreFile(HttpServletRequest request, @RequestParam("files") MultipartFile[] files) throws IOException {
        return fileService.uploadMoreFile(request, files);
    }

    @ApiOperation(value = "下载文件")
    @PostMapping(value="/download")
    public void downloadFile(HttpServletResponse response, @RequestBody DownLoadParam param) throws Exception {
        fileService.downloadFile(response, param);
    }
}

Service 层

package cn.com.easyExcel.service;

import cn.com.easyExcel.param.DownLoadParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public interface FileService {
    String uploadMoreFile(HttpServletRequest request, MultipartFile[] files) throws IOException;

    void downloadFile(HttpServletResponse response, DownLoadParam param) throws Exception;
}

实现

package cn.com.easyExcel.service.impl;

import cn.com.easyExcel.param.DownLoadParam;
import cn.com.easyExcel.service.FileService;
import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;

import static java.util.stream.Collectors.toList;

@Slf4j
@Service
public class FileServiceImpl implements FileService {

    private static final String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

    private static final String ACCESS_CONTROL_EXPOSE = "Access-Control-Expose-Headers";

    private static final String CONTENT_DISPOSITION = "Content-Disposition";

    private static final String CHARACTER = "UTF-8";

    private static final String FILE_DIRECTORY = "static/file/";

    private static final String FILE_NAME = "文件模板.xlsx";

    /**
     * FilenameUtils.getName(originalFilename):获取文件全名,包含后缀
     * FilenameUtils.getBaseName(originalFilename):获取文件名,不含后缀
     * FilenameUtils.getExtension(originalFilename):获取文件后缀
     */
    @Override
    public String uploadMoreFile(HttpServletRequest request, MultipartFile[] files) throws IOException {
        List<MultipartFile> fileList = Arrays.stream(files).collect(toList());
        if(CollUtil.isEmpty(fileList)){
            return "文件不能为空";
        }

        ApplicationHome applicationHome = new ApplicationHome(this.getClass());
        String absolutePath = applicationHome.getDir().getParentFile().getParentFile().getAbsolutePath();
        log.info("绝对路径{}", absolutePath);
        String basePath = absolutePath + "/src/main/resources/static/file/";

        File path = new File(basePath);
        if(!path.exists()){
            path.mkdirs();
        }

        for (MultipartFile file : files) {
            //保存文件
            if (file.isEmpty()) {
                continue;
            }
            String fileName = file.getOriginalFilename();
            assert fileName != null;
            File savePath = new File(basePath, fileName);
            file.transferTo(savePath);
        }
        return "上传完成";
    }

     /**
     * FilenameUtils.getName(originalFilename):获取文件全名,包含后缀
     * FilenameUtils.getBaseName(originalFilename):获取文件名,不含后缀
     * FilenameUtils.getExtension(originalFilename):获取文件后缀
     */
    @Override
    public void downloadFile(HttpServletResponse response, DownLoadParam param) throws Exception {
        URL url = new URL(param.getFileUrl());
        URLConnection conn = url.openConnection();
        conn.setConnectTimeout(3 * 1000);   // 设置超时间为3秒
        conn.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36");
        InputStream inputStream = conn.getInputStream();

        response.reset();
        response.setContentType(CONTENT_TYPE);
        response.setHeader(ACCESS_CONTROL_EXPOSE, CONTENT_DISPOSITION);
        response.setHeader(CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode(FILE_NAME, CHARACTER));

        // 循环取出流中的数据
        byte[] b = new byte[1024 * 5];
        int len;
        while ((len = inputStream.read(b)) > 0) {
            response.getOutputStream().write(b, 0, len);
        }
        inputStream.close();
    }
}

入参实体

package cn.com.easyExcel.param;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class DownLoadParam implements Serializable {
    private static final long serialVersionUID = 7468328149302011645L;

    private String fileUrl;
}

结语:
亲测有效,放心使用!

你可能感兴趣的:(Springboot,java,集合,java,springboot)