JAVA下载单个文件

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


/**
* 下载单个文件
* @return
*/
@RequestMapping("/multipleDownLoad")
public static void getFile(String url, String destFileName, HttpServletResponse httpServletResponse)
throws ClientProtocolException, IOException {
// 生成一个httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
InputStream in = entity.getContent();
try {
httpServletResponse.reset();
httpServletResponse.setHeader("Content-Disposition", "attachment; filename=" + destFileName + ".jpg");
httpServletResponse.setContentType("application/octet-stream; charset=utf-8");
OutputStream out = httpServletResponse.getOutputStream();
int l = 0;
byte[] tmp = new byte[1024];
while ((l = in.read(tmp)) > 0) {
out.write(tmp, 0, l);
}
out.flush();
out.close();
} finally {
// 关闭低层流。
in.close();
}
httpclient.close();

}

}

 


 

改良版:为了解决ie不兼容问题,根据不同的浏览器,分别进行格式转换。

 

@SystemControllerLog(description="下载")
@GetMapping(value="/oneDownLoad")
public static void downLoadFile(String url, String destFileName, HttpServletResponse httpServletResponse)
        throws ClientProtocolException, IOException {
    // 生成一个httpclient对象
    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpGet httpget = new HttpGet(url);
    HttpResponse response = httpclient.execute(httpget);
    HttpEntity entity = response.getEntity();
    InputStream in = entity.getContent();
    String name = new String(destFileName.getBytes("utf-8"), "ISO-8859-1");
    String type = url.substring(url.lastIndexOf(".")+1);
    try {
        httpServletResponse.setHeader("Content-Disposition", "attachment; filename=" + name);
        if("pdf".equals(type)) {
            httpServletResponse.setContentType("application/pdf; charset=utf-8");
        }else if("png".equals(type)) {
            httpServletResponse.setContentType("image/png; charset=utf-8");
        }else if("jpg".equals(type)) {
            httpServletResponse.setContentType("image/jpg; charset=utf-8");
        }
        else if("jpeg".equals(type)) {
            httpServletResponse.setContentType("image/jpeg; charset=utf-8");
        }else {
            httpServletResponse.setContentType("application/octet-stream; charset=utf-8");
        }
        OutputStream out = httpServletResponse.getOutputStream();
        int l = 0;
        byte[] tmp = new byte[1024];
        while ((l = in.read(tmp)) > 0) {
            out.write(tmp, 0, l);
        }
        out.flush();
        out.close();
    } finally {
        // 关闭低层流。
        in.close();
    }
    httpclient.close();
}

 

 

为了解决url中带空格的问题,进行局部转码,全部转码会造成httpGet不识别url,不认为是一个有效的http地址。

 

 

/**
 * 下载单个文件
 * @return
 */
@SystemControllerLog(description="下载")
@GetMapping(value="/oneDownLoad")
public static void downLoadFile(String url, String destFileName,HttpServletRequest req, HttpServletResponse httpServletResponse)
        throws ClientProtocolException, IOException {
    String userAgent = req.getHeader("user-agent").toLowerCase();
    url = url.replace(destFileName,"");
    String fileName = URLEncoder.encode(destFileName, "UTF-8");
    if (userAgent.contains("msie") || userAgent.contains("like gecko") ) {
        // win10 ie edge 浏览器 和其他系统的ie
        destFileName = URLEncoder.encode(destFileName, "UTF-8");
    } else {
        // fe
        destFileName = new String(destFileName.getBytes("UTF-8"), "iso-8859-1");
    }
    // 生成一个httpclient对象
    CloseableHttpClient httpclient = HttpClients.createDefault();
    url = (url + fileName).replace("+","%20");
    HttpGet httpget = new HttpGet(url);
    HttpResponse response = httpclient.execute(httpget);
    HttpEntity entity = response.getEntity();
    InputStream in = entity.getContent();
    String type = url.substring(url.lastIndexOf(".")+1);
    try {
        httpServletResponse.setHeader("Content-Disposition", "attachment; filename=" + destFileName.replace("+"," "));
        if("pdf".equals(type)) {
            httpServletResponse.setContentType("application/pdf; charset=utf-8");
        }else if("png".equals(type)) {
            httpServletResponse.setContentType("image/png; charset=utf-8");
        }else if("jpg".equals(type)) {
            httpServletResponse.setContentType("image/jpg; charset=utf-8");
        }
        else if("jpeg".equals(type)) {
            httpServletResponse.setContentType("image/jpeg; charset=utf-8");
        }else {
            httpServletResponse.setContentType("application/octet-stream; charset=utf-8");
        }
        OutputStream out = httpServletResponse.getOutputStream();
        int l = 0;
        byte[] tmp = new byte[1024];
        while ((l = in.read(tmp)) > 0) {
            out.write(tmp, 0, l);
        }
        out.flush();
        out.close();
    } finally {
        // 关闭低层流。
        in.close();
    }
    httpclient.close();
}

 

 

 

改良版:为了解决上传文件本身的名字带“”+“”的问题,以及文件名称带空格的问题。

主要思想就是在前台传文件url以及名称的地方将有“+”的地方用正则表达式将用特殊字符代替,然后后端替换回去即可解决加号问题以及同时的空格问题。(后端进行encode会将空格转换为“”+“”,与文件名称中可能存在的“+”容易混淆。故而进行以下改良。)

 

前端:

 

 

 

 

 

 

/**
 * 下载单个文件
 * @return
 */
@SystemControllerLog(description="下载")
@GetMapping(value="/oneDownLoad")
public void downLoadFile(String url, String destFileName,HttpServletRequest req, HttpServletResponse httpServletResponse,String id,String type)
        throws ClientProtocolException, IOException, SystemException {

    String userAgent = req.getHeader("user-agent").toLowerCase();
    url = url.replace(destFileName,"");
    String fileName = URLEncoder.encode(destFileName, "UTF-8");
    if (userAgent.contains("msie") || userAgent.contains("like gecko") ) {
        // win10 ie edge 浏览器 和其他系统的ie
        destFileName = URLEncoder.encode(destFileName, "UTF-8");
    } else {
        // fe
        destFileName = new String(destFileName.getBytes("UTF-8"), "iso-8859-1");
    }
    // 生成一个httpclient对象
    CloseableHttpClient httpclient = HttpClients.createDefault();
    url = (url + fileName).replace("+","%20");
    destFileName = destFileName.replace("+","%20");
    destFileName = destFileName.replace("*","+");
    url = url.replace("*","+");
    HttpGet httpget = new HttpGet(url);
    HttpResponse response = httpclient.execute(httpget);
    HttpEntity entity = response.getEntity();
    InputStream in = entity.getContent();
    String typeReq = url.substring(url.lastIndexOf(".")+1);
    try {
        httpServletResponse.setHeader("Content-Disposition", "attachment; filename=" + destFileName);
        if("pdf".equals(typeReq)) {
            httpServletResponse.setContentType("application/pdf; charset=utf-8");
        }else if("png".equals(typeReq)) {
            httpServletResponse.setContentType("image/png; charset=utf-8");
        }else if("jpg".equals(typeReq)) {
            httpServletResponse.setContentType("image/jpg; charset=utf-8");
        }
        else if("jpeg".equals(typeReq)) {
            httpServletResponse.setContentType("image/jpeg; charset=utf-8");
        }else {
            httpServletResponse.setContentType("application/octet-stream; charset=utf-8");
        }
        OutputStream out = httpServletResponse.getOutputStream();
        int l = 0;
        byte[] tmp = new byte[1024];
        while ((l = in.read(tmp)) > 0) {
            out.write(tmp, 0, l);
        }
        out.flush();
        out.close();
    } finally {
        // 关闭低层流。
        in.close();
    }
    httpclient.close();


}

改良版为了去除时间戳去除括号的转义字符()

/**
 * 下载单个文件
 * @return
 */
@SystemControllerLog(description="下载")
@GetMapping(value="/oneDownLoad")
public void downLoadFile(String url, String destFileName,HttpServletRequest req, HttpServletResponse httpServletResponse,String id,String type)
        throws ClientProtocolException, IOException, SystemException {
    String userAgent = req.getHeader("user-agent").toLowerCase();
    url = url.replace(destFileName,"");
    String fileName = URLEncoder.encode(destFileName, "UTF-8");
    if (userAgent.contains("msie") || userAgent.contains("like gecko") ) {
        // win10 ie edge 浏览器 和其他系统的ie
        destFileName = URLEncoder.encode(destFileName, "UTF-8");
    } else {
        // fe
        destFileName = new String(destFileName.getBytes("UTF-8"), "iso-8859-1");
    }
    // 生成一个httpclient对象
    CloseableHttpClient httpclient = HttpClients.createDefault();
    url = (url + fileName).replace("+","%20");
    destFileName = destFileName.replace("+","%20");
    destFileName = destFileName.replace("*","+");
    url = url.replace("*","+");
    HttpGet httpget = new HttpGet(url);
    HttpResponse response = httpclient.execute(httpget);
    HttpEntity entity = response.getEntity();
    InputStream in = entity.getContent();
    String typeReq = url.substring(url.lastIndexOf(".")+1);
    if((destFileName.lastIndexOf(".") - destFileName.lastIndexOf("-")) == 15) {
        //例如:账号配置-20180201181253.xlsx 去除-及其后边的时间戳
        destFileName = destFileName.substring(0,destFileName.lastIndexOf("-")) + "." + typeReq;
    }
    //为了去除()的转义字符
    destFileName = destFileName.replace("%28","(");
    destFileName = destFileName.replace("%29",")");
    try {
        httpServletResponse.setHeader("Content-Disposition", "attachment; filename=" + destFileName);
        if("pdf".equals(typeReq)) {
            httpServletResponse.setContentType("application/pdf; charset=utf-8");
        }else if("png".equals(typeReq)) {
            httpServletResponse.setContentType("image/png; charset=utf-8");
        }else if("jpg".equals(typeReq)) {
            httpServletResponse.setContentType("image/jpg; charset=utf-8");
        }
        else if("jpeg".equals(typeReq)) {
            httpServletResponse.setContentType("image/jpeg; charset=utf-8");
        }else {
            httpServletResponse.setContentType("application/octet-stream; charset=utf-8");
        }
        OutputStream out = httpServletResponse.getOutputStream();
        int l = 0;
        byte[] tmp = new byte[1024];
        while ((l = in.read(tmp)) > 0) {
            out.write(tmp, 0, l);
        }
        out.flush();
        out.close();
    } finally {
        // 关闭低层流。
        in.close();
    }
    httpclient.close();
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值