• java下载url图片链接


    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");
    	}
    
    }

  • 相关阅读:
    DM8168 新三板系统启动
    AndroidAndroid程序提示和消息button响应事件
    Linux核心regulator建筑和准备
    对话(VC_Win32)
    VOJ 1067 Warcraft III 守望者的烦恼 (矩阵高速功率+dp)
    有所述网络流的上限和下限
    Matlab Newton‘s method
    Cocos2d-Java安装和配置跨平台游戏引擎以及相关的开发工具
    n每个计数的概率和发生骰子--动态规划
    自己写CPU第九阶段(3)——加载存储指令说明2(swl、swr)
  • 原文地址:https://www.cnblogs.com/dulinan/p/12033056.html
Copyright © 2020-2023  润新知