controller下载文件(中转文件下载)
controller下载文件(中转文件下载)
通过contrller中转 下载指定url路径的文件
FileController.java
@Controller @RequestMapping("/file") @Api(tags = "文件") public class FileController { @Autowired ILinkappSaveFileService linkappSaveFileService; @GetMapping("/download") @ApiOperation("下载") public InputStream downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException { return linkappSaveFileService.downloadFile(response); } }
ILinkappSaveFileService.java
import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; public interface ILinkappSaveFileService { InputStream downloadFile(HttpServletResponse response) throws IOException; }
LinkappSaveFileService.java
import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; @Component @Slf4j public class LinkappSaveFileService implements ILinkappSaveFileService { @Override public InputStream downloadFile(HttpServletResponse response) { byte[] bytes = new byte[0]; try { bytes = getInputStreamByUrl("https://img.alicdn.com/imgextra/i2/734400460/O1CN01ifcE7W1FGirl9nP2K_!!734400460.jpg_60x60q90.jpg"); } catch (IOException e) { } // byte[] buffer = new byte[inputStream.available()]; // inputStream.read(buffer); // inputStream.close(); // response.reset(); // 设置response的Header //ISO-8859-1可以显示中文的文件名 //获取要下载的文件输入流 OutputStream out=null; try { response.setContentType("application/force-download;charset=UTF-8"); response.setHeader("Content-disposition", "attachment; filename=" + "1.jpg"); // int len = 0; // //创建数据缓冲区 // byte[] buffer = new byte[1024]; // //通过response对象获取outputStream流 out = response.getOutputStream(); out.write(bytes,0,bytes.length); // //将FileInputStream流写入到buffer缓冲区 // while((len = in.read(buffer)) > 0) { // //使用OutputStream将缓冲区的数据输出到浏览器 // out.write(buffer,0,len); // } }catch (Exception e){ }finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } /** * 根据地址获得数据的输入流 * @param strUrl 网络连接地址 * @return url的输入流 */ public static byte[] getInputStreamByUrl(String strUrl) throws IOException { URL url = new URL(strUrl); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置超时间为3秒 conn.setConnectTimeout(3*1000); //防止屏蔽程序抓取而返回403错误 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //得到输入流 InputStream inputStream = conn.getInputStream(); //获取自己数组 byte[] getData = readInputStream(inputStream); return getData; } /** * 从输入流中获取字节数组 * @param inputStream * @return * @throws IOException */ public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); } }