java 文件上传和下载

package springboot_001.controller;

import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.multipart.MultipartFile;
import springboot_001.config.R;
import springboot_001.dao.Dao;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;

@Controller
@RequestMapping("/ows/file")
public class FileController {

    private static String SAVE_FILE_DIR = "./files";

    @Autowired
    Dao dao;

    @PostMapping("/upload")
    public @ResponseBody
    Map<String, Object> uploadFile(
            @RequestParam("file") MultipartFile file, @RequestParam("instanceId") String instanceId,
            @RequestParam("fieldName") String fieldName) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        File dir = new File(SAVE_FILE_DIR + "/" + sdf.format(new Date()));

        if (!dir.exists()) {
            dir.mkdirs();
        }

        String name = file.getOriginalFilename();
        String extName = "";

        if (name.contains(".")) {
            extName = name.substring(name.lastIndexOf(".") + 1, name.length());
        }
        String saveFileName = UUID.randomUUID().toString() + "." + extName;
        String savePath = dir.getPath() + File.separator + saveFileName;
        String saveLocalPath = dir.getCanonicalPath() + File.separator + saveFileName;
        file.transferTo(new File(saveLocalPath));
        Map<String, Object> fileObj = new HashMap<>();
        fileObj.put("NAME", name);
        fileObj.put("EXT_NAME", extName);
        fileObj.put("SAVE_PATH", savePath);
        fileObj.put("FILE_SIZE", file.getSize());
        fileObj.put("INSTANCE_ID", instanceId);
        fileObj.put("FIELD_NAME", fieldName);
        dao.saveOrUpdate(R.FILE, fileObj);
        return fileObj;
    }

    @GetMapping("/download/{fileId}")
    public void download(@PathVariable("fileId") String fileId,
                         HttpServletResponse response) throws Exception {
        Map<String, Object> fileObj = dao.findById2Map(R.FILE, fileId, null);
        String fileName = (String) fileObj.get("NAME");
        String savePath = (String) fileObj.get("SAVE_PATH");
        String extName = (String) fileObj.get("EXT_NAME");
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(savePath))) {
            fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
            if ("xls".equals(extName) ||
                    "xlsx".equals(extName)) {
                response.setContentType("application/vnd.ms-excel;charset=utf-8");
            } else if ("doc".equals(extName) ||
                    "docx".equals(extName)) {
                response.setContentType("application/msword;charset=utf-8");
            } else if ("ppt".equals(extName) ||
                    "pptx".equals(extName)) {
                response.setContentType("application/vnd.ms-powerpoint;charset=utf-8");
            } else if ("pdf".equals(extName)) {
                response.setContentType("application/pdf;charset=utf-8");
            } else if ("jpg".equals(extName) ||
                    "jpeg".equals(extName)) {
                response.setContentType("image/jpeg;charset=utf-8");
            } else if ("png".equals(extName)) {
                response.setContentType("image/png;charset=utf-8");
            } else if ("gif".equals(extName)) {
                response.setContentType("image/gif;charset=utf-8");
            } else if ("dat".equals(extName)) {
                response.setContentType("application/dat;charset=utf-8");
            } else {
                response.setContentType("application/octet-stream;charset=utf-8");
            }
            try (BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream())) {
                byte[] buffered = new byte[1024];
                int len;
                while ((len = bis.read(buffered)) != -1) {
                    bos.write(buffered, 0, len);
                }
            }
        }
    }

    private static final String IMS = "If-Modified-Since";

    @GetMapping("/play/{name}")
    public void play(@PathVariable("name") String name,
                     HttpServletResponse response,
                     HttpServletRequest request,
                     WebRequest webRequest) throws Exception {
        long ims = request.getDateHeader(IMS);
        if (webRequest.checkNotModified(ims)) { //内容没有改变 则直接返回 304
            return;
        }
        String fileName = "audio/" + name;
        ClassPathResource classPathResource = new ClassPathResource(fileName);
        try (InputStream is = classPathResource.getInputStream()) {
            if (name.endsWith(".wav")) {
                response.setContentType("audio/x-wav;charset=utf-8");
            } else if (name.endsWith(".mp3")) {
                response.setContentType("audio/mpeg;charset=utf-8");
            }
            response.setContentLength(is.available());
            SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'",Locale.US);
            response.setHeader("Last-Modified", sdf.format(new Date()));
            try (BufferedInputStream bis = new BufferedInputStream(is)) {
                try (BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream())) {
                    byte[] buffered = new byte[1024];
                    int len;
                    while ((len = bis.read(buffered)) != -1) {
                        bos.write(buffered, 0, len);
                    }
                }
            }
        }
    }
    public static void main(String[] args) {
//        Tue, 24 Sep 2019 08:51:55 GMT
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'",Locale.US);
        System.out.println(sdf.format(new Date()));
    }
}

 @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //获取文件的真实路径 work_project代表项目工程名 需要更改
        String path = System.getProperty("user.dir")+"\\src\\main\\resources\\static\\files\\";
        String os = System.getProperty("os.name");
        if (os.toLowerCase().startsWith("win")) {
            registry.addResourceHandler("/files/**").
                    addResourceLocations("file:"+path);
        }else{//linux和mac系统 可以根据逻辑再做处理
            registry.addResourceHandler("/files/**").
                    addResourceLocations("file:"+path);
        }
        super.addResourceHandlers(registry);
    }
发布了184 篇原创文章 · 获赞 73 · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/qq_32521313/article/details/102567509