例如url: http://pic.58pic.com/58pic/14/62/50/62558PICxm8_1024.jpg(假设链接中有中文) /** * 下载模板 * @param url * @param savePath * @return */ @RequestMapping("/downTemplate") @ResponseBody public String downTemplate(String url, String savePath) { try { //文件名--url后缀,后缀需要url编码 String filename = url.substring(url.lastIndexOf("/") + 1, url.length()); String encodeFileName = URLEncoder.encode(filename,"utf-8"); //url前缀 String substring = url.substring(0, url.lastIndexOf("/") + 1); String urlEnconde = substring + encodeFileName; LOGGER.info("url地址:" + urlEnconde); LOGGER.info("filename地址:" + filename); download(urlEnconde, savePath, filename); return WebUtil.getSuccessJson("下载成功"); } catch (Exception e) { e.printStackTrace(); return WebUtil.getFailureJson("下载失败"); } } public static void download(String urlString, String savePath, String filename) throws Exception { InputStream is = null; OutputStream os = null; HttpURLConnection con = null; try { // 构造URL URL url = new URL(urlString); // 打开连接 con = (HttpURLConnection) url.openConnection(); //设置请求超时为5s con.setConnectTimeout(5 * 1000); con.setDoOutput(true); con.setDoInput(true); con.setRequestMethod("GET"); con.setRequestProperty("connection", "keep-alive"); con.setReadTimeout(30000); con.setUseCaches(false); con.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); con.connect(); is = con.getInputStream(); // 1K的数据缓冲 byte[] bs = new byte[1048576]; // 读取到的数据长度 int len; // 输出的文件流 File sf = new File(savePath); if (!sf.exists()) { sf.mkdirs(); } os = new FileOutputStream(sf.getPath() + "\\" + filename); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } } catch (Exception e) { e.printStackTrace(); } finally { // 完毕,关闭所有链接 if (Objects.nonNull(os)) { os.close(); } if (Objects.nonNull(is)) { is.close(); } if (con != null) { con.disconnect(); } } }
这个时候需要特别注意的是url的后缀需要url编码(测试过如果有中文一定要编码,没有的话可以不用),这个时候url应该是什么样子的,直接拿url去浏览器打开,然后f12看看链接什么样的就参照这个格式.