Stream上传插件的接口列表:接口说明
1、Token接口:
Token的生成规则完全可以自己定义,但是后台可以利用的参数,准确来说就只有name和size,其他参数有变化性,不易控制,官方给的token实现规则是:
A或B + name的hash值(取绝对值,正值就是A,其余是B) + "_" + size
代码如下:
public static String generateToken(String name, String size)
throws IOException {
if (name == null || size == null)
return "";
int code = name.hashCode();
try {
return (code > 0 ? "A" : "B") + Math.abs(code) + "_" + size.trim();
} catch (Exception e) {
throw new IOException(e);
}
}
当然,实际环境中,token可能需要跟上一下用户的信息,并把生成的token存起来,比如放到memcached或数据库,或者最简单就是建立一个文件,总之,就是token就是用来验证用户及文件的。
2、上传接口(查询接口合并到上传接口,GET)
Ajax上传接口比较简单,所有的文件内容可以通过HttpServletRequest的getInputStream()方法取得文件流,代码片段如下:
out = new FileOutputStream(f, true);
content = req.getInputStream();
int read = 0;
final byte[] bytes = new byte[BUFFER_LENGTH];
while ((read = content.read(bytes)) != -1)
out.write(bytes, 0, read);
每次上传文件都会多一个Http头信息(content-range,方面验证文件),基本格式是:
Content-Range: bytes `start`-`end`/`total`
说明: start - 上传开始的字节数;
end - 上传结束的字节数;
total - 文件的总大小
同样,每次也会传size和name参数,这样当发现 end == total 的时候,就标志文件上传完毕,返回的结果中的start值就是文件的总大小。
注意:上传文件必须是在POST方法中进行,Token根据参数获得然后验证就行。
上传接口的GET方法,就是查询文件已经上传多少字节(一般通过查询文件的大小),返回结果如下:
{start:1000,success:true,message:""}
# 说明:success为false标志这次请求失败。
3、Form表单方式上传(包括Flash和FormData两种)
就是传统的表单处理方式,Java还是采用新版的commons-fileupload文件上传处理jar包,有什么变化参考: 官方说明 ,获取InputStream的方式如下:
ServletFileUpload upload = new ServletFileUpload();
InputStream in = null;
String token = null;
try {
FileItemIterator iter = upload.getItemIterator(req);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
in = item.openStream();
if (item.isFormField()) {
String value = Streams.asString(in);
if (TokenServlet.TOKEN_FIELD.equals(name)) {
token = value;
/** TODO: validate your token. */
}
System.out.println(name + ":" + value);
} else {
String fileName = item.getName();
start = IoUtil.streaming(in, token, fileName);
}
}
} catch (FileUploadException fne) {
success = false;
message = "Error: " + fne.getLocalizedMessage();
} finally {
try {
if (success)
json.put(StreamServlet.START_FIELD, start);
json.put(TokenServlet.SUCCESS, success);
json.put(TokenServlet.MESSAGE, message);
} catch (JSONException e) {}
writer.write(json.toString());
IoUtil.close(in);
IoUtil.close(writer);
}
在TODO的地方完成Token的验证。
4、跨域上传的处理
<?xml version="1.0" encoding="UTF-8"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/json");
resp.setHeader("Access-Control-Allow-Headers", "Content-Range,Content-Type");
resp.setHeader("Access-Control-Allow-Origin", origins);
resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
}
需要依赖的jar包:
commons-fileupload-1.3.jar
commons-io-2.1.jar
json-20090211.jar
PHP的版本好像没有下文了!