关于七牛云JavaSDK上传

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值