Stream上传插件(Java接口实现)

原创
2013/12/17 15:44
阅读数 982

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、跨域上传的处理

Flash方式:直接在服务器的跟目录下添加crossdomain.xml文件就可以,具体规则,Google去。下面是所有Domain都通过的样例:
<?xml version="1.0" encoding="UTF-8"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
Ajax方式:在第2个接口中重写OPTION方法,如下(还是允许所有Domain):
@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


主页:http://www.twinkling.cn/

PHP的版本好像没有下文了!



展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部