1.从之前写的一篇中改写了代码,从远程的url链接中下载图片,并对各种浏览器的中文文件名进行展示
/**
* 根据url路径下载图片
* @param filename 处理下载时显示设置好的中文名 eg:张三的照片.jpg
* @param path 要保存在本地的临时路径(下载之后会将保存在此处的图片删除)eg: d:/image
* @param url 图片链接 eg: http://photo.baidu.com/111.jpg
* @param request
* @param response
*/
public static void downloadFileFromImageServer(String filename, String path, String url, HttpServletRequest request, HttpServletResponse response) {
try {
// 1.得到下载文件的名称.必须处理乱码.
filename = GetEncode.transcode(filename);
// 2.从upload目录下查找filename文件是否存在。
URL httpurl = new URL(url);
String fileName = IDUtil.getUUID() + url.substring(url.lastIndexOf("."));
File file = new File(path + fileName);
FileUtils.copyURLToFile(httpurl, file);
// 下载设置
// 1.设置mimetype类型
String mimeType = new MimetypesFileTypeMap().getContentType(file);
response.setContentType(mimeType); // 根据文件名获取这种文件的mimeType值,设置到http响应头中。
// 以下代码解决了浏览器显示下载文件名乱码问题
String agent = request.getHeader("User-agent");
String viewfilename = null;
if (agent.contains("MSIE")) {
// IE浏览器
viewfilename = URLEncoder.encode(filename, "utf-8");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
viewfilename = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else if (agent.contains("Chrome")) {
// google浏览器
viewfilename = URLEncoder.encode(filename, "utf-8");
} else {
// 其它浏览器
viewfilename = URLEncoder.encode(filename, "utf-8");
}
// 2.设置响应头 Content-Dispositon.
response.setHeader("Content-Disposition", "attachment;filename="
+ viewfilename);
if (file.exists()) {
// 存在
// 3.通过输入流将这个文件内容读取出来,通过response获取输出流,写回到浏览器.
FileInputStream fis = new FileInputStream(file);
OutputStream os = response.getOutputStream();
int len = -1;
byte[] b = new byte[1024];
while ((len = fis.read(b)) != -1) {
os.write(b, 0, len);
os.flush();
}
try {
fis.close();
os.close();
file.delete();
}
catch (IOException e1) {
e1.printStackTrace();
}
} else {
// 不存在
throw new RuntimeException("下载资源不存在");
}
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException("下载资源名称转码异常");
}
catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("下载资源不存在");
}
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("下载资源流异常");
}
}
2.用到的转码工具类
import java.io.UnsupportedEncodingException;
/**
* 编码解码工具类
* @author wugang
*
*/
public class GetEncode {
public static String transcode(String str, String sourceCharset, String targetCharset){
if (str == null)
return null;
String retStr = str;
byte b[];
try{
b = str.getBytes(sourceCharset);
for(int i=0; i < b.length; i++){
byte b1 = b[i];
if(b1 == 63)
break;
else if(b1 > 0)
continue;
else if(b1 < 0){
retStr = new String(b, targetCharset);
break;
}
}
b = retStr.getBytes();
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
return retStr;
}
/**
* 将字符串先按ISO8859-1解码,再按UTF-8编码
* @param str
* @return
*/
public static String transcode(String str){
if(str == null || "".equals(str.trim()))
return "";
return transcode(str,"ISO8859-1", "UTF-8");
}
}