java开发在线下载功能,自动打开浏览器下载功能下载网络文件或图片
因为业务的需要,公司产品要求商品详情页面有个下载的功能
找了很多的方法,发现有的需要打开一个新窗口,而且在某些浏览器上不适用,所以继续寻找更好的方法
跟同事沟通后发现他那里有个下载的方法,不过是C#写的,改了改发现有些地方不太通用,所以继续百度。
后来找到一段可以用的代码,用了自己的前端js代码,加上百度的java代码修改后,发现可以达到自己的需求
于是,更新博客,留作以后使用。
本套代码示例基于springMVC 开发;
Java代码如下:
1.首先编写cotroller进行调用;
@RequestMapping(value="downLoadFromUrl")
public void downLoadFromUrl(HttpServletRequest request,HttpServletResponse response) throws IOException{
DownloadUtils.downLoadFromUrl(request, response);
}
2.下载功能的实现代码DownloadUtils;
package com.utils; import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* 在线下载图片功能*/
public class DownloadUtils {
public static void downLoadFromUrl(HttpServletRequest request,HttpServletResponse response) throws IOException{
String downloadUrl = request.getParameter("fileName");
URL url = new URL(downloadUrl);
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();
try {
String[] fileNameParts = downloadUrl.split("/");
String fileName = fileNameParts[fileNameParts.length - 1];
// String fileName = "aaa.jpg";
fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1");
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename="+fileName);
String len = String.valueOf(inputStream.available()/1000+"k");
response.setHeader("Content-Length", len);
OutputStream out = response.getOutputStream();
byte[] getData = readInputStream(inputStream);
out.write(getData);
inputStream.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 从输入流中获取字节数组
* @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();
}
}
3.js代码如下;
function downloadFile() {
var pic=$("input[name='pic']
window.location = "/product_big/downLoadFromUrl?fileName="+pic;
}
最后感谢万能的百度
下面这个是打包下载文件的java代码,上面的是直接下载图片的,下面这个可以实现批量打包下载
@RequestMapping(value = "/downLoadImage", method = RequestMethod.GET)
public void downLoadImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
List<String> urls = Lists.newArrayList();
String path = request.getParameter("pictureUrl");
urls.add(path);
Map<String, InputStream> isMap = Maps.newHashMap();
for (String urlStr : urls) {
String[] fileNameParts = urlStr.split("/");
String fileName = fileNameParts[fileNameParts.length - 1];
try {
URL url = new URL(urlStr);
URLConnection con = url.openConnection();
// 设置超时间为3秒
con.setConnectTimeout(3 * 1000);
// 防止屏蔽程序抓取而返回403错误
con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
InputStream is = con.getInputStream();
isMap.put(fileName, is);
} catch (Exception e) {
e.printStackTrace();
}
}
String[] fileNameParts = path.split("/");
String fileNames = fileNameParts[fileNameParts.length - 1];
response.setContentType("application/octet-stream");
String filename = URLEncoder.encode(fileNames, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".zip");
ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
for (Entry<String, InputStream> is : isMap.entrySet()) {
String fileName = is.getKey();
InputStream value = is.getValue();
try {
addToZip(value, zipOut, fileName); } catch (Exception e) {
e.printStackTrace();
}
}
zipOut.flush();
zipOut.close(); } private void addToZip(InputStream is,ZipOutputStream zipOut, String fileName) throws IOException {
fileName = URLEncoder.encode(fileName, "UTF-8");
ZipEntry entry = new ZipEntry(fileName);
zipOut.putNextEntry(entry);
int len;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) > 0) { zipOut.write(buffer, 0, len);
}
zipOut.closeEntry();
is.close();
}
java开发在线下载功能,自动打开浏览器下载功能下载网络文件或图片的更多相关文章
- webpack之带有可自动打开浏览器及热重载的基本配置
什么是Webpack WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并 ...
- webpack--运行npm run dev自动打开浏览器运行首页的两种方式以及热加载
作为开发人员,我们在修改了代码之后,在vscode终端运行npm run dev指令后,希望它可以自动打开浏览器方便我们调试,有两种方式可以实现: 自动打开浏览器的两种方式: 方式一: 1.webpa ...
- SpringBoot启动后自动打开浏览器访问项目
之前我们用SSM或者SSH进行JAVA WEB开发的时候,IDEA 需要配置Tomcat然后把项目放到tomcat运行,tomcat启动的时候会自动打开浏览器去访问项目,但是SpringBoot是内嵌 ...
- vue-cli2.9.1如何自动打开浏览器及实现手机调试
在vue-cli2.9.1以前我们运行 "npm run dev" 程序会自动打开浏览器进行调试,而且在手机浏览器输入 "IP地址:8080" 能实现在手机端的 ...
- vue中npm run dev运行项目自动打开浏览器
npm run dev运行项目自动打开浏览器设置自动打开浏览器 // 各种设备设置信息 host: 'localhost', //主机名 port: 8080, // 端口号(默认 ...
- vue中npm run dev运行项目不能自动打开浏览器! 以及 webstorm跑vue项目jshint一直提示错误问题的解决方法!
vue中npm run dev运行项目不能自动打开浏览器!以及 webstorm跑vue项目jshint一直提示错误问题的解决方法! 1.上个项目结束就很久没有使用vue了,最近打算用vue搭建自己的 ...
- vue中npm run dev 不能自动打开浏览器运行项目
最近用vue2.0 + webpack搭建了环境创建新的项目.出现一个很蹩脚的问题: 在终端输入 npm run dev 的时候,不能自动打开浏览器运行项目. 这段话的意思是:你的应用程序运行地址是: ...
- autoOpenBrowser: true, 运行npm后自动打开浏览器
autoOpenBrowser: true, 运行npm后自动打开浏览器
- Jupyter Notebook不能自动打开浏览器
安装了 Winpython,运行Jupyter Notebook.exe或Jupyter lab.exe,总是不能自动打开浏览器,提示"no web browser found" ...
- vue 使用 npm run dev命令后 自动打开浏览器
1.使用vue-cli 老版本构建项目时, 可修改config文件夹下index.js文件 autoOpenBrowser 属性给为 true 即可 使用vue-cli 3.x 版本后,所有的配置项均 ...
随机推荐
- Java冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序
冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序地数列,一次比较两个元素,如果它们地顺序错误就把它们交换过来.走访数列地工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. ...
- Onedrive分享型网盘搭建 - OneManager
注册账号 部署OneManager 注册完账号后打开网址:https://heroku.com/deploy?template=https://github.com/qkqpttgf/OneManag ...
- Java 线程与同步的性能优化
本文探讨的主题是,如何挖掘出Java线程和同步设施的最大性能. 1.线程池与ThreadPoolExecutor 1)线程池与ThreadPoolExecutor 线程池的实现可能有所不同,但基本概念 ...
- 轻量级分布式延时任务处理组件easyTask-L-入门篇
今天给大家介绍一款新武器.我自研的一个java组件easyTask-L.这个是做啥的呢?我之前研发了一款单机版本的easyTask,这次是要介绍另外一款easyTask-L.区别就是后者支持分布式环境 ...
- MySQL组复制MGR(二)-- 组复制搭建
(一)主机操作 (1)路由信息vmnet5 192.168.10.0 (2)主机信息 主机名称 IP地址 操作系统版本 数据库版本 mgr-node1 192.168.10.11 centos 7.4 ...
- intellij IDEA导入maven项目
一.导入maven项目 1.打开intellij idea,点击File(如下图1),然后点击Open(如下图2)
- 一个使用android相机的例子,二维码必须用相机
https://blog.csdn.net/feiduclear_up/article/details/51968975
- defineProperty 和Proxy双向绑定演示,你还不知道么?
双向绑定,也就是说js中的数据传到页面,页面中的内容到js,实现同步更新,简单的演示可以直接复制下放HTML代码运行. 在这个例子中,我们使用defineProperty ,Object.define ...
- 让你的GitHub下载飞速提升到2M/s以上
2020年7月27日整理发布多种GitHub加速方式! 转载自:https://code.pingbook.top/blog/2020/How-To-Speed-Github.html 1. GitH ...
- PHP jddayofweek() 函数
------------恢复内容开始------------ 实例 返回 1998 年 1 月 13 日这天是周几: <?php$jd=gregoriantojd(1,13,1998);echo ...