package com.mzl.flower.web.upload; import com.mzl.flower.base.BaseController; import com.mzl.flower.config.exception.ValidationException; import com.mzl.flower.dto.response.upload.UploadResultDTO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; @RestController @RequestMapping("/api/download") @Api(value = "文件下载", tags = "文件下载") @Slf4j public class FileDownloadResource extends BaseController { @GetMapping("/file") @ResponseBody @ApiOperation(value = "文件下载", httpMethod = "GET", response = UploadResultDTO.class, notes = "文件下载") public void downloadFile(final String fileName, final String filePath, HttpServletResponse response) throws IOException { URL url = new URL(filePath); URLConnection uc = url.openConnection(); String contentType = uc.getContentType(); int contentLength = uc.getContentLength(); if (contentType.startsWith("text/") || contentLength == -1) { throw new ValidationException("文件为空"); } try (InputStream raw = uc.getInputStream()) { InputStream in = new BufferedInputStream(raw); byte[] data = new byte[contentLength]; int offset = 0; while (offset < contentLength) { int bytesRead = in.read(data, offset, data.length - offset); if (bytesRead == -1) { break; } offset += bytesRead; } if (offset != contentLength) { throw new ValidationException("文件为空"); } // 清空response response.reset(); // 设置response的Header /*String name = fileName; if(name != null){ name = new String(name.getBytes("gb2312"), "ISO8859-1"); }*/ response.addHeader("Content-Disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\""); response.addHeader("Content-Length", "" + contentLength); response.setContentType("application/octet-stream"); try (OutputStream out = new BufferedOutputStream(response.getOutputStream())) { out.write(data); out.flush(); } } } }