文档章节

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

java_speed
 java_speed
发布于 2013/12/17 15:44
字数 809
阅读 424
收藏 0

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的版本好像没有下文了!



© 著作权归作者所有

共有 人打赏支持
java_speed
粉丝 112
博文 44
码字总数 17031
作品 1
成都
程序员
私信 提问
Java 8 新特性,Lambda,方法引用,Stream,Optional

在C++、Python等语言里都有Lambda表达式,Java 8也新增了这一特性。 在java给变量赋值是这样的: 如果你想把“一块代码”赋给一个Java变量,应该怎么做呢? 比如,我想把右边那块代码,赋给一...

saulc
2018/07/10
0
0
Java 8新增特性优缺点

Java 8于今年三月份正式发布了。那么它是否如我们之前所期待的那样呢?下面我们就一一查看Java8新增特性的优缺点吧。 Java 8试图“创新”,根据 微软对这个词的定义,就是把其他框架或语言里...

Emilypz
2015/09/25
662
1
Stream上传插件(数据接口变化)

Stream上传插件在设计上有些缺陷: 用户想完全自定义上传文件的展示页面(现在的js接口不满足); 部分重要的响应事件没有响应的回调函数; 上传过的文件没有数据存根; 等等,上述主要问题,...

java_speed
2014/01/21
0
2
Java 9 中的 9 个新特性

Java 8 发布三年多之后,即将快到2017年7月下一个版本发布的日期了。 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新。 这里有九个令人兴奋的新功能将与 Java 9 一起...

oschina
2017/05/02
15.6K
29
Lambda 表达式有何用处?如何使用?(针对Java8)

什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个“值”。 如果你想把“一块代码”赋给一个Java变量,应该怎么做呢? 比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的J...

亭子happy
2018/06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-13(Mybatis基本概念和简单的例子)

在mybatis初次学习Mybatis的时候,遇到了很多问题,虽然阿里云的视频有教学,但是视频教学所使用的软件和我自己使用的软件不用,我自己用的数据库是oracle数据库,开发环境是idea。而且视频中...

白话
今天
3
0
Java基础:String、StringBuffer和StringBuilder的区别

1 String String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。 String类的包含如下定义: /** The value is used for character storage. */private final cha...

watermelon11
今天
2
0
mogodb服务

部署MongoDB 官网: https://www.mongodb.com/download-center/community 创建mongo数据目录 mkdir /data/mongodb 二进制部署 wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x8......

以谁为师
昨天
5
0
大神教你Debian GNU/Linux 9.7 “Stretch” Live和安装镜像开放下载

Debian项目团队于昨天发布了Debian GNU/Linux 9 "Stretch" 的第7个维护版本更新,重点修复了APT软件管理器中存在的安全漏洞。在敦促每位用户尽快升级系统的同时,Debian团队还发布了Debian ...

linux-tao
昨天
4
0
PHP 相关配置

1. php-fpm的pool 编辑php-fpm配置文件php-fpm.con vim /usr/local/php/etc/php-fpm.conf //在[global]部分增加以下内容 include = etc/php-fpm.d/*.conf # 相当与Nginx的虚拟主机文件 “vho......

Yue_Chen
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部