@GetMapping("downProcessFile.do")
@ApiOperation(value = "test导出", tags = {"productAccess"}, httpMethod = "GET")
public void downProcessFile(HttpServletRequest request, HttpServletResponse response) {
String url = "http://fsmartbucket-30011.sz.gfp.tencent-cloud.com/123aa21088d846d8931cb463defd6694xlsx";
String url2="http://fsmartbucket-30011.sz.gfp.tencent-cloud.com/123aa21088d846d8931cb463defd6694xlsx";
try {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url2);
HttpResponse httpResponse = httpClient.execute(httpGet);
int ret = httpResponse.getStatusLine().getStatusCode();
long contentLength = httpResponse.getEntity().getContentLength();
InputStream fis = httpResponse.getEntity().getContent();
*//* BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer();*//*
// File file = new File(path);
// String filename = file.getName();// 获取日志文件名称
String filename = "abc.xlsx";
// fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
response.reset();
// 先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码,这个文件名称用于浏览器的下载框中自动显示的文件名
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.replaceAll(" ", "").getBytes("utf-8"), "iso8859-1"));
response.addHeader("Content-Length", "" + contentLength);
OutputStream os = new BufferedOutputStream(response.getOutputStream());
//response.setContentType("application/octet-stream");
response.setContentType("application/vnd.ms-excel");
os.write(buffer);// 输出文件
os.flush();
os.close();
} catch (Exception e) {
e.getMessage();
}
}
@GetMapping("downProcessFile2.do")
@ApiOperation(value = "test导出2", tags = {"productAccess"}, httpMethod = "GET")
public void downProcessFile2() throws Exception{
String getURL="http://fsmartbucket-30011.sz.gfp.tencent-cloud.com/123aa21088d846d8931cb463defd6694xlsx";
URL getUrl = new URL(getURL);
// 根据拼凑的URL,打开连接,URL.openConnection函数会根据URL的类型,
// 返回不同的URLConnection子类的对象,这里URL是一个http,因此实际返回的是HttpURLConnection
HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
// 进行连接,但是实际上get request要在下一句的connection.getInputStream()函数中才会真正发到
// 服务器
connection.setConnectTimeout(25000);
connection.setReadTimeout(25000);
connection.connect();
int status = connection.getResponseCode();
if (status == 200) {
DataInputStream in = new DataInputStream( connection.getInputStream());
DataOutputStream out = new DataOutputStream(new FileOutputStream("abc.xlsx"));
byte[] buffer = new byte[4096];
int count = 0;
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
out.close();
in.close();
} else {
String strResponse = "error";
}
connection.disconnect();
}
/**
* 产品手册批量下载(以压缩包的格式)
*
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping("downloadManual")
public HttpServletResponse downLoadFiles(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
File dir = new File("E:\\manual\\");
*//**创建一个临时压缩文件,我们会把文件流全部注入到这个文件中,这里的文件你可以自定义是.rar还是.zip**//*
File file = new File("E:/manual.rar");
if (!file.exists()) {
file.createNewFile();
}
response.reset();
return downloadZip(file, response);
} catch (Exception e) {
e.printStackTrace();
}
*//**直到文件的打包已经成功了,文件的打包过程被我封装在FileUtil.zipFile这个静态方法中,稍后会呈现出来,接下来的就是往客户端写数据了**//*
return response;
}
/**
* 以流的形式下载文件
*
* @param file
* @param response
* @return
*/
public static HttpServletResponse downloadZip(File file, HttpServletResponse response) {
try {
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
//如果输出的是中文名的文件,在此处就要用URLEncoder.encode方法进行处理
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
File f = new File(file.getPath());
// f.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}
/**
* 根据输入的文件与输出流对文件进行打包
*
* @param inputFile
* @param ouputStream
*/
public static void zipFile(File inputFile, ZipOutputStream ouputStream) {
try {
if (inputFile.exists()) {
*//**如果是目录的话这里是不采取操作的,至于目录的打包正在研究中**//*
if (inputFile.isFile()) {
FileInputStream IN = new FileInputStream(inputFile);
BufferedInputStream bins = new BufferedInputStream(IN, 1024);
//org.apache.tools.zip.ZipEntry
ZipEntry entry = new ZipEntry(inputFile.getName());
ouputStream.putNextEntry(entry);
// 向压缩文件中输出数据
int nNumber;
byte[] buffer = new byte[1024];
while ((nNumber = bins.read(buffer)) != -1) {
ouputStream.write(buffer, 0, nNumber);
}
// 关闭创建的流对象
bins.close();
IN.close();
} else {
try {
File[] files = inputFile.listFiles();
for (int i = 0; i < files.length; i++) {
zipFile(files[i], ouputStream);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@GetMapping("downProcessFile3.do")
@ApiOperation(value = "test导出3", tags = {"productAccess"}, httpMethod = "GET")
public Response<JSONObject> downProcessFile3(String url, String name, HttpServletResponse response) {
String url2="http://fsmartbucket-30011.sz.gfp.tencent-cloud.com/123aa21088d846d8931cb463defd6694xlsx";
HttpURLConnection conn = null;
try {
URL path = new URL(url2);
conn = (HttpURLConnection) path.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream 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(("abc.xlsx").getBytes("GBK"),"ISO8859_1"));
response.addHeader("Content-Length", "" + buffer.length);
OutputStream toClient = response.getOutputStream();
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}finally {
if(conn != null) {
conn.disconnect();
}
}
}
/**
* 从输入流中获取数据
* @param fis 输入流
* @return
* @throws IOException
*/
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();
}
把response body以流的形式下载文件
最新推荐文章于 2025-10-15 16:03:02 发布
本文详细介绍如何使用Java实现文件的远程下载、流处理及压缩包下载,包括使用HttpClient、HttpURLConnection进行网络请求,处理输入输出流,以及利用ZipOutputStream进行文件压缩并下载。

9722

被折叠的 条评论
为什么被折叠?



