需求:应用服务器和文件服务器分离。在七牛中用的是key:value的方式存储文件而不是树形结构。key是文件名要唯一,值就是文件。
基本流程
1.服务器生成上传策略。
2.编写上传文件的页面。
3.上传成功回掉服务器。
4.保存一些文件信息。
准备
下载jar包,搭建环境。一些文件,注册七牛账户,开辟对象存储。
七牛要用到的相关jar包如下。
开工
private static String accessKey ="***";//你的AK
private static String secretKey ="***";//你的SK
public static String bucket = "***";//你的bucket
//获取上传策略,可封装到一个工具类里
public static String getToken(){
Auth auth = Auth.create(accessKey, secretKey);
return auth.uploadToken(bucket,null,3600,new StringMap()
.put("callbackUrl","http://***")
.put("callbackBody", "{"\"name\":\"$(x:name)\",\"price\":\"$(x:price)\", "\"time\":\"$(avinfo.format.duration)\",\"videosize\":\"$(avinfo.format.size)\",\"coursepath\":\"$(key)\"}")
.put("callbackBodyType", "application/json")
);
}
简单说下上传策略,callbackUrl是指文件上传成功后回掉服务端的请求地址,为什么要回掉,因为在上传完成时需要获取相关信息保存到数据库里,而回掉带过来的参数写在callbackBody里面,是以json方式,所以需要注意格式,参数名:参数值的形式,如果值是从表单提交过去的,要写成x:name的形式,如果是七牛内部的数据,官方文档中有,这里的avinfo.format.duration是指视频文件的时长。callbackBodyType以json形式返回。
- controller
@RequestMapping(value="/gettoken")
public String gettoken(HttpServletRequest request) throws UnsupportedEncodingException{
String to=UpToken.getToken();
Date d=new Date();
request.setAttribute("time", d.getTime());
request.setAttribute("toke", to);
return "**.jsp";
}
这里我用的springMVC框架,获取到上传策略,放到request中,这里还放了一个时间的long类型作为文件名,保证key唯一。
- 页面,action是固定的这样写,其他属性注意到name,price的name值要加上x:,用于七牛识别。
<form method="post" action="http://upload.qiniu.com/" enctype="multipart/form-data">
name:<input type="text" name="x:name"/>
price:<input type="text" name="x:price"/>
<input name="key" type="hidden" value="${time}">
<input name="token" type="hidden" value="${toke}">
file:<input type="file" name="file"/>
<button type="submit">上传</button>
</from>
- 回掉,在上传成功之后就去调用上传策略里的那个地址,解析json,用的fastjson。
@RequestMapping(value="/add.app",produces="application/json;charset=utf-8")
public String add(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException{
StringBuilder sb=null;
try {
String line = "";
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));
sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
String tb=sb.toString();
JSONObject jsonObject = JSONObject.fromObject(tb);
String coursepath=jsonObject.getString("coursepath");
String name=jsonObject.getString("name");
String price=jsonObject.getString("price");
String time=jsonObject.getString("time");
//其他操作,将数据保存到数据库什么的...
renturn "**";