文件上传和下载

代码示例:

import com.demo.entity.properties.FileConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;

@Component
public class FileUtil {

    private static final Logger logger = LoggerFactory.getLogger(FileUtil.class);

    @Autowired
    FileConfig fileConfig;

    @Autowired
    private static FileConfig staticFileConfig;

    @PostConstruct
    public void init(){
        staticFileConfig = fileConfig;
    }

    /**
     * 单文件上传
     * @param file 上传文件
     * @param isDeleteLastDay 是否删除前一天文件
     * @throws Exception
     */
    public static void upload(MultipartFile file, Boolean isDeleteLastDay){

        if(file.isEmpty()){
            //上传文件不能为空
        }

        if (isDeleteLastDay){
            // 删除前一天生成的文件
            Date date = new Date(System.currentTimeMillis() - 1000*60*60*24);
            File folder = new File(staticFileConfig.getUpFilePath());
            File[] files = folder.listFiles();
            if (files != null){
                for (int i = 0;  i < files.length; i++){
                    File delete = files[i];
                    if (new Date(delete.lastModified()).before(date)){
                        delete.delete();
                    }
                }
            }
        }

        String fileName = file.getOriginalFilename();

        File dest = new File(staticFileConfig.getUpFilePath() + "/" + fileName);
        if(!dest.getParentFile().exists()){ //判断文件父目录是否存在
            dest.getParentFile().mkdir();
        }

        try {
            file.transferTo(dest); //保存文件
            //上传成功
        } catch (IllegalStateException e) {
            e.printStackTrace();
            //上传失败
        } catch (IOException e) {
            e.printStackTrace();
            //上传失败
        }
    }

    /**
     * 多文件上传
     * @param files 上传文件
     * @param isDeleteLastDay 是否删除前一天文件
     * @throws Exception
     */
    public static void multiUpload(HttpServletRequest request, Boolean isDeleteLastDay){
        List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");

        if (files.isEmpty()){
            //上传文件不能为空
        }

        if (isDeleteLastDay){
            // 删除前一天生成的文件
            Date date = new Date(System.currentTimeMillis() - 1000*60*60*24);
            File folder = new File(staticFileConfig.getUpFilePath());
            File[] listFiles = folder.listFiles();
            if (files != null){
                for (int i = 0;  i < listFiles.length; i++){
                    File delete = listFiles[i];
                    if (new Date(delete.lastModified()).before(date)){
                        delete.delete();
                    }
                }
            }
        }

        for (MultipartFile file:files){
            String fileName = file.getOriginalFilename();

            File dest = new File(staticFileConfig.getUpFilePath() + "/" + fileName);
            if(!dest.getParentFile().exists()){ //判断文件父目录是否存在
                dest.getParentFile().mkdir();
            }

            try {
                file.transferTo(dest);
            }catch (Exception e) {
                e.printStackTrace();
                //上传失败
            }
        }
        //上传成功
    }

    /**
     * 文件下载
     * @param response
     * @param fileName 下载文件全名-包括后缀
     * @param isDelete 是否下载后删除
     * @return
     * @throws UnsupportedEncodingException
     */
    public static Rsp download(HttpServletResponse response, String fileName, boolean isDelete) throws UnsupportedEncodingException{
        File file = new File(staticFileConfig.getDownFilePath() + "/" + fileName);
        if(file.exists()){ //判断文件是否存在
//            response.setContentType("application/force-download");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName,"utf8"));
            byte[] buffer = new byte[1024];
            FileInputStream fis = null; //文件输入流
            BufferedInputStream bis = null;

            OutputStream os = null; //输出流
            try {
                os = response.getOutputStream();
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                int i = bis.read(buffer);
                while(i != -1){
                    os.write(buffer);
                    i = bis.read(buffer);
                }

            } catch (Exception e) {
                e.printStackTrace();
                //下载失败
            }
            try {
                bis.close();
                fis.close();
                if (isDelete){
                    // 删除文件
                    file.delete();
                }
            } catch (IOException e) {
                e.printStackTrace();
                //下载失败
            }
        }else {
            //下载文件不存在
        }
        //下载成功
    }

}

以下代码如有疑问,请参考在静态方法中调用Spring注入的类的方法

    @Autowired
    FileConfig fileConfig;

    @Autowired
    private static FileConfig staticFileConfig;

    @PostConstruct
    public void init(){
        staticFileConfig = fileConfig;
    }
posted @ 2021-11-16 11:13  丶六千里  阅读(41)  评论(0)    收藏  举报