因为业务的需要,公司产品要求商品详情页面有个下载的功能

找了很多的方法,发现有的需要打开一个新窗口,而且在某些浏览器上不适用,所以继续寻找更好的方法

跟同事沟通后发现他那里有个下载的方法,不过是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开发在线下载功能,自动打开浏览器下载功能下载网络文件或图片的更多相关文章

  1. webpack之带有可自动打开浏览器及热重载的基本配置

    什么是Webpack WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并 ...

  2. webpack--运行npm run dev自动打开浏览器运行首页的两种方式以及热加载

    作为开发人员,我们在修改了代码之后,在vscode终端运行npm run dev指令后,希望它可以自动打开浏览器方便我们调试,有两种方式可以实现: 自动打开浏览器的两种方式: 方式一: 1.webpa ...

  3. SpringBoot启动后自动打开浏览器访问项目

    之前我们用SSM或者SSH进行JAVA WEB开发的时候,IDEA 需要配置Tomcat然后把项目放到tomcat运行,tomcat启动的时候会自动打开浏览器去访问项目,但是SpringBoot是内嵌 ...

  4. vue-cli2.9.1如何自动打开浏览器及实现手机调试

    在vue-cli2.9.1以前我们运行 "npm run dev" 程序会自动打开浏览器进行调试,而且在手机浏览器输入 "IP地址:8080" 能实现在手机端的 ...

  5. vue中npm run dev运行项目自动打开浏览器

    npm run dev运行项目自动打开浏览器设置自动打开浏览器 // 各种设备设置信息      host: 'localhost', //主机名      port: 8080, // 端口号(默认 ...

  6. vue中npm run dev运行项目不能自动打开浏览器! 以及 webstorm跑vue项目jshint一直提示错误问题的解决方法!

    vue中npm run dev运行项目不能自动打开浏览器!以及 webstorm跑vue项目jshint一直提示错误问题的解决方法! 1.上个项目结束就很久没有使用vue了,最近打算用vue搭建自己的 ...

  7. vue中npm run dev 不能自动打开浏览器运行项目

    最近用vue2.0 + webpack搭建了环境创建新的项目.出现一个很蹩脚的问题: 在终端输入 npm run dev 的时候,不能自动打开浏览器运行项目. 这段话的意思是:你的应用程序运行地址是: ...

  8. autoOpenBrowser: true, 运行npm后自动打开浏览器

    autoOpenBrowser: true, 运行npm后自动打开浏览器

  9. Jupyter Notebook不能自动打开浏览器

    安装了 Winpython,运行Jupyter Notebook.exe或Jupyter lab.exe,总是不能自动打开浏览器,提示"no web browser found" ...

  10. vue 使用 npm run dev命令后 自动打开浏览器

    1.使用vue-cli 老版本构建项目时, 可修改config文件夹下index.js文件 autoOpenBrowser 属性给为 true 即可 使用vue-cli 3.x 版本后,所有的配置项均 ...

随机推荐

  1. 开会时CPU 飙升100%同事们都手忙脚乱记一次应急处理过程

    告警 正在开会,突然钉钉告警声响个不停,同时市场人员反馈客户在投诉系统登不进了,报504错误.查看钉钉上的告警信息,几台业务服务器节点全部报CPU超过告警阈值,达100%. 赶紧从会上下来,SSH登录 ...

  2. UML学习笔记—基本概念和初始阶段

    chpater1 1.什么是分析和设计 分析:对问题和需求的调查研究 设计:满足需求的概念上的解决方案 做正确的事(分析)和正确地做事(设计) 2.什么是Object-Oriented-Analysi ...

  3. JVM系列6-GC算法

    一.如何判定垃圾? 1.1.Reference Count引用计数法:引用计数count=0的对象 1.2.Root Seaching根可达法:从root开始不可达的对象 常见的可做GC roots的 ...

  4. void operator()()的功能

    在学习多线程的时候看到这样的一段代码,为什么要重载()呢?真有这个必要吗? #include <iostream> #include <thread> class Counte ...

  5. GPO - General GPO Settings(3)

    WMI filtering Setting - Differentiating Installation Between Operations and Architecture. WMI SQL Ge ...

  6. ES6语法——Promise对象

    一.概念 Promise是异步编程的一种解决方案(解决回调地狱的问题),是一个能够获取异步操作信息的对象.Promise的内部保存着某个未来才会结束的事件(通常是一个异步操作) 二.特点 1.Prom ...

  7. 常用CSS颜色表

    1.16进制的CSS颜色代码 > http://www.jsjtt.com/webkaifa/HTML/65.html

  8. Redis(一)简介及安装、测试

    一.Redis简介: 关于关系型数据库和nosql数据库 关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据 库是基于特殊的结构,并将数据存储到内存的数据库.从性能上而言, ...

  9. 删除表中重复数据,只删除重复数据中ID最小的

    delete t_xxx_user where recid in ( select recid from t_xxx_user where recid in ( select min(recid) f ...

  10. MacOS下Lucene学习

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"lucene"获取视频和教程资料! b站在线视频 全文 ...