这里演示的是InputStream对象的上传,适用于所有的InputStream子类。这里的ByteInputStream只用来演示目的,实际用法根据现象而定。
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
String accessKey = "your access key";
String secretKey = "your secret key";
String bucket = "your bucket name";
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = null;
try {
byte[] uploadBytes = "hello qiniu cloud".getBytes("utf-8");
ByteArrayInputStream byteInputStream=new ByteArrayInputStream(uploadBytes);
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
Response response = uploadManager.put(byteInputStream,key,upToken,null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
} catch (UnsupportedEncodingException ex) {
//ignore
}
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
//...其他参数参考类注释
//...生成上传凭证,然后准备上传
String accessKey = "your access key";
String secretKey = "your secret key";
String bucket = "your bucket name";
//如果是Windows情况下,格式是 D:\\qiniu\\test.png
String localFilePath = "/home/qiniu/test.mp4";
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = null;
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
String localTempDir = Paths.get(System.getenv("java.io.tmpdir"), bucket).toString();
try {
//设置断点续传文件进度保存目录
FileRecorder fileRecorder = new FileRecorder(localTempDir);
UploadManager uploadManager = new UploadManager(cfg, fileRecorder);
try {
Response response = uploadManager.put(localFilePath, key, upToken);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
有些情况下,回到给上传端的内容不是默认的hash和key形式,这样现象下,应该出现在自定义returnBody或者自定义了callbackBody的现象下,两者一般是服务端直传的画面,而后者则是接受上传回调的画面,这两种情景之下,都涵盖到需要将自定义的回复内容解析为Java的类对象,一般建议在交互过程中,都采用JSON的方法,这种处理起来方法比较一致,但是JSON的方式最通用。
碰到譬如自定义returnBody的现象:

putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fsize\":$(fsize)}");
如果是自定义了callbackBody的现象:
putPolicy.put("callbackBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fsize\":$(fsize)}");
我们只需要自己定义了对应的类,例如:
class MyPutRet {
public String key;
public String hash;
public String bucket;
public long fsize;
}
然后在获取到上传回复的Response对象时,使用如下的方式就可以转为自定义回复的类对象了:
MyPutRet myPutRet=response.jsonToObject(MyPutRet.class);
在上传策略里面设置了上传回调相关参数的时候,在文档上传到服务器之后,会主动地向callbackUrl发送POST请求的下跌,上行的内容为callbackBody模版所定义的内容,所以这个模板里面引用了如果,所以这种函数会被自动填满对应的值,然后在发送给业务服务器。
业务服务器在收到来自的下跌请求的时候,可以按照请求头部的Authorization字段来进行验证,察看该请求是否是来自的未经篡改的请求。具体可以参考的下跌鉴权。
注意:业务端服务器回调鉴权的Content-Type类型也是与上传策略中指定的callbackBodyType相同,默认为 application/x-www-form-urlencoded七牛云开发者中心,当 Content-Type 为 application/x-www-form-urlencoded 时,签名内容必须包含请求内容。当 Content-Type 为 application/json 时,签名内容不包含请求内容。
String accessKey = "your access key";
String secretKey = "your secret key";
/*
* 这两个参数就是在定义PutPolicy参数时指定的内容
*/
//回调地址
String callbackUrl = "http://api.example.com/qiniu/callback";
//定义回调内容的组织格式,与上传策略中的callbackBodyType要保持一致
//String callbackBodyType = "application/x-www-form-urlencoded"; //回调鉴权的签名包括请求内容callbackBody
String callbackBodyType = "application/json";//回调鉴权的签名不包括请求内容
/**
* 这两个参数根据实际所使用的HTTP框架进行获取
*/
//通过获取请求的HTTP头部Authorization字段获得
String callbackAuthHeader = "xxx";
//通过读取回调POST请求体获得,不要设置为null
byte[] callbackBody = null;
Auth auth = Auth.create(accessKey, secretKey);
//检查是否为七牛合法的回调请求
boolean validCallback = auth.isValidCallback(callbackAuthHeader, callbackUrl, callbackBody, callbackBodyType);
if (validCallback) {
//继续处理其他业务逻辑
} else {
//这是哪里的请求,被劫持,篡改了吧?
}
文件下载分为公开空间的文档下载和私有空间的文档下载。
对于公开空间,其访问的链接主要是将空间绑定的域名(可以是空间的默认域名或者是绑定的自定义域名)拼接上空间上面的文件名即可访问,标准状况下需要在拼接链接之前,将文件名进行urlencode以兼容不同的符号。
String fileName = "公司/存储/qiniu.jpg";
String domainOfBucket = "http://devtools.qiniu.com";
String finalUrl = String.format("%s/%s", domainOfBucket, fileName);
System.out.println(finalUrl);
对于私有空间,其次需要根据公开空间的文档访问方法建立对应的公开空间访问链接,然后再对这个链接进行私有授权签名。
String fileName = "公司/存储/qiniu.jpg";
String domainOfBucket = "http://devtools.qiniu.com";
String encodedFileName = URLEncoder.encode(fileName, "utf-8").replace("+", "%20");
String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
String accessKey = "your access key";
String secretKey = "your secret key";
Auth auth = Auth.create(accessKey, secretKey);
long expireInSeconds = 3600;//1小时,可以自定义链接过期时间
String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);
System.out.println(finalUrl);
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-118827-2.html
全部是假冒产品