加哥今天给大家分享一个使用java代码实现用网络url实现文件的下载方法,在平时的学习或者开发中有人总会需要给你一个地址让你调用java代码实现文件的下载。话不多说,直接给大家上代码。
下面的代码是一个Controller层的方法,在方法上我们定义了请求路径,请求时候需要传递的参数。不论是图片、压缩文件包、word文档、pdf文档、excel表格文件等都可以实现下载,只要网路地址传输没问题。
package com.sunwayland.quartz; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; @Slf4j @Controller("test") public class Download { @RequestMapping("checkDownload") public void checkDownload(@ApiParam("文件地址") @RequestParam("url") String url, HttpServletResponse response) throws Exception { HttpURLConnection conn = null; InputStream fis = null; try { File file = new File(url); // 取得文件的后缀名。 String ext = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase(); StringBuffer buffername = new StringBuffer(url.substring(url.lastIndexOf("/")+1)); // 取的文件名 String filename = buffername.toString(); URL path = new URL(url); conn = (HttpURLConnection) path.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5 * 1000); // 通过输入流获取数据 fis = conn.getInputStream(); byte[] buffer = readInputStream(fis); if (null != buffer && buffer.length > 0) { // 清空response response.reset(); // 设置response的Header response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); response.addHeader("Content-Length", "" + buffer.length); OutputStream toClient = response.getOutputStream(); //response.setContentType("application/x-msdownload"); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); } } catch (IOException ex) { log.error("下载文件异常:", ex); throw new Exception("下载异常,请稍后再试。"); } finally { if (conn != null) { conn.disconnect(); } if (fis != null) { try { fis.close(); } catch (IOException ioe) { log.error("下载文件->关闭流异常:", ioe); } } } } /** * 从输入流中获取数据 * * @param fis : InputStream * @return byte[] * @author chenp * @date 2023/3/28 11:31 */ private byte[] readInputStream(InputStream fis) throws IOException { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) != -1) { outStream.write(buffer, 0, len); } fis.close(); return outStream.toByteArray(); } } 注意:大家在测试的过程中需要注意传输的网络地址正确;注意文件名称的响应编码格式,如果大家在swagger里面测试出现来的类似于%ADBB的名称时注意可以尝试在浏览器直接测试,它把中文文件名做了一个转义会让你错觉认为自己的乱码了。