最近在开发过程中,遇到这样一个需求,对接区块链的SDK,需要上传文件到区块链上,考虑到效率问题将文件放到专门的文件服务器上,区块链那边只存一个文件的URL然后每次请求要通过URL去文件服务器上去校验文件是否被篡改。接下来可以用到我接下来用到的代码了
这个是对文件的流信息进行计算hash值 通过url 可以得到文件的hash值(基本上获取到文件的流了,就可以说获取到这个文件了,剩下的基本就是对文件流操作,可以复制,计算文件大小等等)
URL url = new URL(replace);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setConnectTimeout(5000000);
conn.setReadTimeout(5000000);
conn.setRequestProperty( "Content-Type", "application/json");
//conn.addRequestProperty("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
conn.setRequestProperty( "Content-Encoding", "utf-8");
conn.addRequestProperty("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
conn.setRequestMethod("GET");
conn.connect();
InputStream inputStream = conn.getInputStream();
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024];
int length = -1;
while ((length = inputStream.read(buffer, 0, 1024)) != -1) {
md.update(buffer, 0, length);
}
inputStream.close();
//转换并返回包含16个元素字节数组,返回数值范围为-128到127
byte[] md5Bytes = md.digest();
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;//解释参见最下方
if (val < 16) {
/**
* 如果小于16,那么val值的16进制形式必然为一位,
* 因为十进制0,1...9,10,11,12,13,14,15 对应的 16进制为 0,1...9,a,b,c,d,e,f;
* 此处高位补0。
*/
hexValue.append("0");
}
//这里借助了Integer类的方法实现16进制的转换
hexValue.append(Integer.toHexString(val));
}
String s = hexValue.toString();
下面的是计算文件的大小 字节数
URL url = new URL(replace);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setConnectTimeout(500000);
conn.setReadTimeout(500000);
conn.addRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
conn.setRequestMethod("GET");
conn.connect();
long contentLengthLong = conn.getContentLengthLong();
这样就可以了