文件上传是几乎每个app都需要的功能,用户头像上传这个都得有吧。我们公司是视频制作公司,除了需要上传用户发布视频,还有特效,贴图,音乐,模板等等文件,个人云空间,所以随处都有上传文件的需要。
主流平台云上传:
七牛云Qiniu:七牛云则专注于打造数据为核心的场景化 Pass 服务商。
阿里云OSS:是目前国内最大的云计算服务商,提供海量、安全、高可靠的云存储服务。
腾讯云COS:腾讯云对象存储是有腾讯云提供的快速上手的非结构化数据存储服务。
总体来说,各家云存储在一些核心的参数上差距不大。综合考虑之后,选择了七牛云(其实就是老板为了节约成本,数据量大之后流量费差别挺大的)。
七牛公司并不是大公司,但是用户量很大。七牛在国内也属于做云存储比较早的,提供了覆盖服务端、移动端等共计11种语言的SDK,除了提供SDK之外,七牛还提供了不同的工具,包括了同步上传客户端、命令行工具、命令行辅助工具、数据迁移工具、检测工具等。你可以借助这些工具来实现自己的目的,如果不会使用相关的工具,可以到 Segmentfault 的七牛云专区获取帮助。
七牛云的图片处理同样中规中矩,提供了图片的裁剪、缩略、水印、模糊等功能,不过七牛支持的图片输出的格式较多,除了标准的图片外,还支持 WebP 格式的图片。其中存储空间免费10GB、下载流量20GB、10万次PUT请求和100万次GET请求。
上传流程:
客户端上传文件之前先要向服务端请求上传凭证token,再用sdk提供的对象
uploadManager.put(filePath, key, token, new UpCompletionHandler() ),传入本地文件路径filePath,指定服务器文件名key和该token。
引入库
compile 'com.qiniu:qiniu-android-sdk:7.3.3'
上传的QiniuUploadManager类:
public class QiniuUploadManager {
private String filePath;
private String key;
private String token;
private boolean isCancel;
public QiniuUploadManager(String filepath, String key, String token){
this.filePath = filepath;
this.key = key;
this.token = token;
}
public void uploadFile(){
// 国内https上传
boolean https = true;
Zone z1 = new AutoZone(https, null);
Configuration config = new Configuration.Builder().zone(z1).build();
UploadManager uploadManager = new UploadManager(config);
uploadManager.put(filePath, key, token, new UpCompletionHandler() {
@Override
public void complete(String key, ResponseInfo info, JSONObject response) {
if (onUploadComplete != null){
onUploadComplete.onUploadComplete(key,response);
}
}
},new UploadOptions(null, null, false, new UpProgressHandler() {
@Override
public void progress(String key, double percent) {
if (onUploadComplete != null){
onUploadComplete.onUploadProgress(key,percent);
}
}
}, new UpCancellationSignal() {
@Override
public boolean isCancelled() {
return isCancel;
}
}));
}
public void setCancel(boolean cancel) {
isCancel = cancel;
}
private IOnUploadComplete onUploadComplete;
public void setOnUploadComplete(IOnUploadComplete onUploadComplete) {
this.onUploadComplete = onUploadComplete;
}
public interface IOnUploadComplete{
void onUploadComplete(String key, JSONObject response);
void onUploadProgress(String key, double percent);
}
/**
* 文件上传七牛
* @param token
* @param path
* @param listener
*/
public static void uploadFile(final String token, String path, final ICallStrListener listener, final ICalldoubleListener doubleListener) {
String fileType = path.substring(path.lastIndexOf(".")-1); //上传文件名
String key = "temp/" + System.currentTimeMillis() + fileType;
final QiniuUploadManager upload = new QiniuUploadManager(path, key, token);
upload.setOnUploadComplete(new QiniuUploadManager.IOnUploadComplete() {
@Override
public void onUploadComplete(String key, JSONObject response) {
listener.callBack(key);
}
@Override
public void onUploadProgress(String key, double percent) {
doubleListener.callBack(percent);
}
});
upload.uploadFile();
}
}
两个回调类:
public interface ICalldoubleListener {
void callBack(double num);
}
public interface ICallStrListener {
void callBack(String str);
}
调用方法:
/**
* 文件上传七牛
* @param token 上传凭证
* @param path 本地文件路径
* @param listener
*/
QiniuUploadManager.uploadFile(token,path, new ICallStrListener() {
@Override
public void callBack(String key) {
//返回七牛上传的文件url
}
}, new ICalldoubleListener() {
@Override
public void callBack(double num) {
//当前上传进度
}
});