package com.bjb.util;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.storage.model.FileListing;
import com.qiniu.util.Auth;
import com.qiniu.util.UrlSafeBase64;
import net.sf.json.JSONObject;
public class QiniuUpload {
String ACCESS_KEY = "ACCESS_KEY";
String SECRET_KEY = "SECRET_KEY";
//要上传的空间
String bucket = "jlpt";
Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
Zone z = Zone.autoZone();
Configuration c = new Configuration(z);
UploadManager uploadManager = new UploadManager(c);
BucketManager bucketManager = new BucketManager(auth,c);
/**
* 服务端生成qiniu云存储的token,默认过期时间为3600秒
* @return 返回生成一个有效的token
*/
public String getUpToken() {
return auth.uploadToken(bucket);
}
/**
* 服务器端生成qiniu云的token,有效时间可以自定义,单位为:秒数(s)
* @param expires 设置token的有效时间,单位为:秒数(s) 一年的有效时间为 31536000(s)
* @return 返回生成一个有效的token
*/
public String getUpToken(long expires){
return auth.uploadToken(bucket, null, expires, null);
}
/**
* 获取上传文件的token
* @param usefulTime token有效时间(单位:秒)
* @param bucket 上传的空间
* @throws Exception
* */
public String getUpToken(long usefulTime,String bucket) throws Exception{
//构造上传策略
JSONObject json = new JSONObject();
long deadline = System.currentTimeMillis() / 1000 + usefulTime;
String uploadToken = null;
// 有效时间为一个小时
json.put("deadline", deadline);
json.put("scope", bucket);
String encodedPutPolicy = UrlSafeBase64.encodeToString(json.toString().getBytes());
byte[] sign = hMacSHA1Encrypt(encodedPutPolicy, SECRET_KEY);
String encodedSign = UrlSafeBase64.encodeToString(sign);
uploadToken = ACCESS_KEY + ':' + encodedSign + ':' + encodedPutPolicy;
return uploadToken;
}
/**
* 根据本地路径上传到qiniu云上
* @param path
* @param filename
* @throws QiniuException
*/
public void upload(String path,String filename) throws QiniuException {
//调用put方法上传
String stolen = getUpToken();
Response res = uploadManager.put(path, filename, stolen);
//打印返回的文件名
String bodyStr = res.bodyString();
JSONObject jsonBody = JSONObject.fromObject(bodyStr);
System.out.println(jsonBody.getString("key"));
//打印返回的信息
System.out.println(res.bodyString());
}
/**
* 根据输入流上传到qiniu云
* @param stream
* @param filename
* @throws QiniuException
*/
public void upload(InputStream stream,String filename) throws QiniuException{
//调用put方法上传
String stolen = getUpToken();
Response res = uploadManager.put(stream,filename,stolen,null,null);
//打印返回的文件名
String bodyStr = res.bodyString();
JSONObject jsonBody = JSONObject.fromObject(bodyStr);
System.out.println(jsonBody.getString("key"));
//打印返回的信息
System.out.println(res.bodyString());
}
/**
* 根据文件名,删除云空间的文件
* @param bucket 云存储的空间名
* @param fileName 删除的文件名
* @return
* @throws Exception
*/
@SuppressWarnings({ "deprecation", "resource" })
public boolean deleteFile(String bucket, String fileName) throws Exception{
String entryUrl = bucket+":"+fileName;
String encodedEntryURI = UrlSafeBase64.encodeToString(entryUrl.getBytes());
String host = "http://rs.qiniu.com";
String path = "/delete/"+encodedEntryURI;
String url = host+path;
byte[] sign = hMacSHA1Encrypt(path+"\n", SECRET_KEY);
String encodedSign = UrlSafeBase64.encodeToString(sign);
String authorization = ACCESS_KEY + ':' + encodedSign;
HttpClient httpClient = new DefaultHttpClient();
HttpPost method = new HttpPost(url);
method.setHeader("Content-Type","application/x-www-form-urlencoded");
method.setHeader("Authorization", "QBox "+authorization);
// 连接超时时间
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 20000);
// 读取超时时间
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,20000);
HttpResponse response = httpClient.execute(method);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if(statusCode == HttpStatus.SC_OK){
return true;
}
return false;
}
/**
* 删除单个文件
* @param key
* @return
* @throws QiniuException
*/
public boolean deleteFile(String key) throws QiniuException{
bucketManager.delete(bucket, key);
return true;
}
/**
* 列举文件条目
* @param bucket 要查询的云存储的空间
* @param prefix 要查询文件名的前缀
* @param limit 要查询的条数
* @return
* @throws Exception
*/
public List<String> getUploadList(String bucket,String prefix,int limit) throws Exception{
List<String>fileList = new ArrayList<String>();
FileListing fileListing = bucketManager.listFiles(bucket,prefix,null,limit,null);
FileInfo[] items = fileListing.items;
for(FileInfo fileInfo:items){
fileList.add(fileInfo.key);
}
return fileList;
}
private static final String MAC_NAME = "HmacSHA1";
private static final String ENCODING = "UTF-8";
/**
*
* 使用 HMAC-SHA1 签名方法对对encryptText进行签名
* @param encryptText 被签名的字符串
* @param encryptKey 密钥
* @return
* @throws Exception
*/
public static byte[] hMacSHA1Encrypt(String encryptText, String encryptKey)
throws Exception {
byte[] data = encryptKey.getBytes(ENCODING);
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
// 生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance(MAC_NAME);
// 用给定密钥初始化 Mac 对象
mac.init(secretKey);
byte[] text = encryptText.getBytes(ENCODING);
// 完成 Mac 操作
return mac.doFinal(text);
}
}
关于七牛云JavaSDK上传
最新推荐文章于 2023-02-01 16:28:00 发布