Java多文件下载打包zip返回客户端,不写入本地

来源:互联网 发布:广州数控圆弧编程实例 编辑:程序博客网 时间:2024/06/11 15:59

综合网上的资料自行整合的方法可直接复制使用。如果电脑装载360浏览器,可能会直接下载到本地,容易给开发者造成误扰,(以为写入本地,这时可以采用其他人电脑访问开发者服务器进行测试)参考文献:http://blog.csdn.net/sinat_32849651/article/details/77098161

 

 

@RestController
@RequestMapping("xxxx")
public class DownLoadController {

private static final Logger logger = LoggerFactory.getLogger(UrlFilesToZip.class);
/**
* 下载多个文件这
* @return
*/
@RequestMapping("/multipleDownLoad")
public static void getFile(String urls, String destFileName, HttpServletResponse response)
throws ClientProtocolException, IOException {

List<String> urlList = new ArrayList<>();
for(String id : StringUtils.splitToList(urls,",")){
urlList.add(id);
}
try {
String filename = new String((destFileName+".zip").getBytes("UTF-8"), "ISO8859-1");//控制文件名编码
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(bos);
UrlFilesToZip s = new UrlFilesToZip();
int idx = 1;
String postfix = "";
for (String oneFile : urlList) {
if (!(oneFile == null || oneFile.indexOf(".") == -1)){
//如果图片地址为null或者地址中没有"."就返回""
postfix = oneFile.substring(oneFile.lastIndexOf(".") + 1).trim().toLowerCase();
}
if(StringUtils.isNotNull(postfix)) {
postfix = "."+postfix;
}
zos.putNextEntry(new ZipEntry(destFileName + idx+postfix));
byte[] bytes = s.getImageFromURL(oneFile);
zos.write(bytes, 0, bytes.length);
zos.closeEntry();
idx++;
}
zos.close();
response.setContentType("application/octet-stream; charset=utf-8");
// response.setContentType("application/force-download");// 设置强制下载不打开
response.addHeader("Content-Disposition", "attachment;fileName=" + filename);// 设置文件名
OutputStream os = response.getOutputStream();
os.write(bos.toByteArray());
os.close();
} catch (FileNotFoundException ex) {
logger.error("FileNotFoundException", ex);
} catch (Exception ex) {
logger.error("Exception", ex);
}
}
}

 

 

 

public class StringUtils {    public static List<String> splitToList(String str, String regex) {        if(isNull(str)) {            return null;        } else {            ArrayList resultList = new ArrayList();            List resultObject = arrayToList(str.split(regex));            Iterator i$ = resultObject.iterator();            while(i$.hasNext()) {                Object obj = i$.next();                resultList.add(obj.toString());            }            return resultList;        }    }}

/**
* Created by Admin on 2017/10/19.
*/
public class UrlFilesToZip {
private static final Logger logger = LoggerFactory.getLogger(UrlFilesToZip.class);
//根据文件链接把文件下载下来并且转成字节码
public byte[] getImageFromURL(String urlPath) {
byte[] data = null;
InputStream is = null;
HttpURLConnection conn = null;
try {
URL url = new URL(urlPath);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
// conn.setDoOutput(true);
conn.setRequestMethod("GET");
conn.setConnectTimeout(6000);
is = conn.getInputStream();
if (conn.getResponseCode() == 200) {
data = readInputStream(is);
} else {
data = null;
}
} catch (MalformedURLException e) {
logger.error("MalformedURLException", e);
} catch (IOException e) {
logger.error("IOException", e);
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
logger.error("IOException", e);
}
conn.disconnect();
}
return data;
}
public byte[] readInputStream(InputStream is) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = -1;
try {
while ((length = is.read(buffer)) != -1) {
baos.write(buffer, 0, length);
}
baos.flush();
} catch (IOException e) {
logger.error("IOException", e);
}
byte[] data = baos.toByteArray();
try {
is.close();
baos.close();
} catch (IOException e) {
logger.error("IOException", e);
}
return data;
}

 

}