java 加载https/http/本地类型路径的图片

一个读取网络路径和本地路径 图片的例子(亲测可用)

需求:

1.读取https、http类型,以及本地类型的图片。

其中,加载https类型的图片时不能沿用http的获取方法,否则会报unable to find valid certification path to requested target 的错误。

具体原因是,因为https(http+SSL)简单讲是http的安全版,即http下加入SSL层,https的安全基础是SSL,因此加密的详细内容就需要SSL。

解决办法:此处使用https的Get请求来解决证书验证的问题。

2.用日志记录相关信息(引入commons-logging-1.1.jar包

3.为了安全 ,对结果数据进行编码、解码,

问题:

首先为什么BASE64Encoder和BASE64Decoder在Eclipse中不能使用?

       编码解码使用sun包下的BASE64Encoder和BASE64Decoder两个工具把任意序列的8位字节描述为一种不易被人直接识别的形式;但不能使用是因为他们是Sun公司专用的API,在Eclipse后来的版本中都不能直接使用,但是直接使用文本编辑器编写代码,然后使用javac编译,java去执行是没有问题的。

怎么设置才可以在Eclipse中使用BASE64Encoder和BASE64Decoder?

       右击项目 --> Properties --> Java Build Path --> 点开JRE SystemLibrary --> 点击Access rules --> Edit --> Add --> Resolution选择Accessible--> Rule Pattern 填** --> OK

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class TestReadImgWithUrlOrPath {
	public static Log log=LogFactory.getLog(TestReadImgWithUrlOrPath.class);

	public static void main(String s[]) throws IOException
	{
		String urlOrPath="C:\\Users\\files\\Pictures\\kaola.jpg";
		
		//String urlOrPath="http://pic4.nipic.com/20091217/3885730_124701000519_2.jpg";
		System.out.println(urlOrPath);
		System.out.println(readImg(urlOrPath));
		
	}
	/*
	 * 读取远程和本地文件图片
	 */
	public static String readImg(String urlOrPath){
        InputStream in = null;
        try {
          byte[] b ;
       //加载https途径的图片(要避开信任证书的验证)
         if(urlOrPath.toLowerCase().startsWith("https")){
            b=HttpsUtils.doGet(url);
         }else if(urlOrPath.toLowerCase().startsWith("http")){ 
          //加载http途径的图片
            	URL url = new URL(urlOrPath);
    			in = url.openStream();    			           	
            }else{ //加载本地路径的图片
                File file = new File(urlOrPath);
                if(!file.isFile() || !file.exists() || !file.canRead()){
                    log.info("图片不存在或文件错误");
                    return "error";
                }                
                in = new FileInputStream(file);
            }
            b = getByte(in); //调用方法,得到输出流的字节数组
			return base64ToStr(b);    //调用方法,为防止异常 ,得到编码后的结果

        } catch (Exception e) {
        	log.error("读取图片发生异常:"+ e);
        	return "error";
        }
    }
	
	public static byte[] getByte(InputStream in) throws IOException {
		ByteArrayOutputStream out = new ByteArrayOutputStream();		
		try {
			byte[] buf=new byte[1024]; //缓存数组
			while(in.read(buf)!=-1){ //读取输入流中的数据放入缓存,如果读取完则循环条件为false;
				out.write(buf); //将缓存数组中的数据写入out输出流,如果需要写到文件,使用输出流的其他方法
				}
			out.flush();
			return out.toByteArray();	//将输出流的结果转换为字节数组的形式返回	(先执行finally再执行return	)
		} finally{
			if(in!=null){
					in.close();
			}
			if(out!=null){
				out.close();
			}			
		}
	}
	
	/*
	 * 编码
	 * Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式
	 */
	public static String base64ToStr(byte[] bytes) throws IOException {
		String content = "";
		content = new BASE64Encoder().encode(bytes);
		return content.trim().replaceAll("\n", "").replaceAll("\r", ""); //消除回车和换行
	}
	/*
	 * 解码
	 */
	public static byte[] strToBase64(String content) throws IOException {
		if (null == content) {
			return null;
		}
		return new BASE64Decoder().decodeBuffer(content.trim());
	}

}
import javax.net.ssl.*;
import java.io.*;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * @desc: 实现https请求,可用于加载https路径的存储图片,避开信任证书的验证。
 */
public class HttpsUtils {
  private static final class DefaultTrustManager implements X509TrustManager {
	@Override
	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
	}

	@Override
	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
	}

	@Override
	public X509Certificate[] getAcceptedIssuers() {
	  return null;
	}
  }

  private static HttpsURLConnection getHttpsURLConnection(String uri, String method) throws IOException {
	SSLContext ctx = null;
	try {
	  ctx = SSLContext.getInstance("TLS");
	  ctx.init(new KeyManager[0], new TrustManager[]{new DefaultTrustManager()}, new SecureRandom());
	} catch (KeyManagementException e) {
	  e.printStackTrace();
	} catch (NoSuchAlgorithmException e) {
	  e.printStackTrace();
	}
	SSLSocketFactory ssf = ctx.getSocketFactory();

	URL url = new URL(uri);
	HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();
	httpsConn.setSSLSocketFactory(ssf);
	httpsConn.setHostnameVerifier(new HostnameVerifier() {
	  @Override
	  public boolean verify(String arg0, SSLSession arg1) {
		return true;
	  }
	});
	httpsConn.setRequestMethod(method);
	httpsConn.setDoInput(true);
	httpsConn.setDoOutput(true);
	return httpsConn;
  }

  private static byte[] getBytesFromStream(InputStream is) throws IOException {
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	byte[] kb = new byte[1024];
	int len;
	while ((len = is.read(kb)) != -1) {
	  baos.write(kb, 0, len);
	}
	byte[] bytes = baos.toByteArray();
	baos.close();
	is.close();
	return bytes;
  }

  private static void setBytesToStream(OutputStream os, byte[] bytes) throws IOException {
	ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
	byte[] kb = new byte[1024];
	int len;
	while ((len = bais.read(kb)) != -1) {
	  os.write(kb, 0, len);
	}
	os.flush();
	os.close();
	bais.close();
  }

  public static byte[] doGet(String uri) throws IOException {
	HttpsURLConnection httpsConn = getHttpsURLConnection(uri, "GET");
	return getBytesFromStream(httpsConn.getInputStream());
  }

  public static byte[] doPost(String uri, String data) throws IOException {
	HttpsURLConnection httpsConn = getHttpsURLConnection(uri, "POST");
	setBytesToStream(httpsConn.getOutputStream(), data.getBytes());
	return getBytesFromStream(httpsConn.getInputStream());
  }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 I. 目录 1 II. java c/cpp互相调用实例(姊妹篇之一)——java调用c/cpp 4 一 先制作一个系统中有的DLL文件(cpp给出的sdk接口) 4 二 JNI 7 1、 编写java文件 7 2、 生成.h头文件 8 3、 用c/cpp实现这个头文件 9 三 测试 10 四 最后补充 11 III. java c/cpp互相调用实例(姊妹篇之二)——c/cpp调用java 11 一、 编写java代码 12 二、 编译java代码 12 三、 编写 C/C++ 代码 13 四、 运行exe 18 IV. Java JNI 编程进阶 18 一、 解决性能问题 18 二、 解决本机平台接口调用问题 19 三、 嵌入式开发应用(JNI小例子) 20 1、 新增一个基础类 22 2、 定义新类继承基础类 23 3、 编写调用类 23 4、 新增两个本地方法 24 5、 修改 RunMain 类 25 6、 新增一个方法处理java对象 26 7、 新增一个方法处理数组 29 8、 改写RunMain 32 四、 参考资料: 33 V. Eclipse+CDT+MinGW 进行JAVA调用C/C++ 34 一、 安装eclipse3.2。 34 二、 安装MinGW。 34 1、 下载MinGW 34 2、 安装 34 3、 安装版本 34 4、 选择安装的编译器 34 5、 选择安装路径,下一步 35 6、 等待下载软件 35 三、 MinGW的环境变量设置 35 1、 设置Path 35 2、 设置C_INCLUDE_PATH 35 3、 设置CPLUS_INCLUDE_PATH 35 四、 做一个小技巧修改 35 五、 安装CDT插件 36 1、 下载CDT插件 36 2、 安装CDT插件 36 六、 简单介绍CDT的使用吧 36 1、 新建一个C++项目 36 2、 输入New Project名字 36 3、 给项目新建一个的源文件 36 4、 接着出现文件添加的窗口,在File Name栏里面写上文件名 36 5、 编辑hello.cpp 37 6、 添加一个编译命令 37 七、 让我们开始进入真正的工作吧! 38 The Java side 38 1、 建立Java工程JavaHello,编写java类 38 2、 用命令生成头文件 38 The C side-Compiling the Library 40 1、 建立标准C工程Cpro,并生成dll文件 40 1) 将生成的头文件test_Hello.h拷贝到C工程Cpro下 40 2) 编写C类Hello.c,内容为: 40 3) 在C工程Cpro下建立hello.def文件(用于定义导出的函数),内容为: 40 4) 在C工程Cpro下建立makefile文件,内容为: 40 5) Make Targets 40 6) Make Targets视图下双击step1,在C工程Cpro下生成hello.o 文件。 41 7) Make Targets视图下双击step1,在C工程Cpro下生成hello.dll 文件。 41 2、 JAVA调用DLL 41 1) 将hello.dll拷贝到Java工程JavaHello下。 41 2) 运行Hello.java,则可以看到输出结果: 41 1) 将Hello.c改为Hello.cpp 41 2) 将makefile内容改为: 41 3) 其他的几乎都不用改变也可以。 42 评论: 42 VI. c++如何调用java程序 51 DemoMain.java内容如: 51 采用vc6++ IDE,采用JNI技术实现。 51 1、 编译时 51 2、 运行时 51 程序的关键在 53 VII. JNI 53 一、 定义 53 二、 设计目的 54 三、 书写步骤 54 1) 编写java程序:这里以HelloWorld为例。 54 2) 编译 55 3) 生成扩展名为h的头文件 55 4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。 56 5) 生成动态库 56 6) 运行程序 java HelloWorld就ok. 56 四、 调用中考虑的问题 56 1) java和c是如何互通的? 57 2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是bytearray的话,作如下处理得到buffer: 58 VIII. C/C++调用JAVA类 58 一、 加载虚拟机: 59 二、 获取指定对象的类定义: 59 三、 获取要调用的方法: 59 四、 调用JAVA类方法: 60 五、 获得类属性的定义: 60 六、 数组处理: 60 七、 异常: 60 八、 多线程调用 61 Java代码 61 命令行运行:javap -s -p MyTest ,输出: 62 C代码testjava.c: 62 编译: 65 运行结果: 65

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值