`
daogangtang
  • 浏览: 61248 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Bamboo对Upload的支持

 
阅读更多
Bamboo Web框架对上传提供了方便的接口。目前支持的特性如下:

  • 它同时支持html4和html5上传,且用统一接口处理;
  • 同时支持单文件和多文件上传;
  • 目前仅支持小于指定值(在mongrel2的配置文件中设定)的文件的上传,且是放在内存中一次性处理(后面视需求考虑支持大文件上传,大文件上传在mongrel2中已有很好的支持);
  • 上传的文件会直接存储在磁盘上,同时会在数据库中有一份对应的记录;

Bamboo定义了一个基本的Upload模型,这个模型有如下字段:

  • name  文件名字
  • path  文件在服务器资源目录下的完整路径
  • size  文件的大小,按字节计算
  • timestamp  文件上传(创建)的时间
  • desc  文件的描述


使用方式如下:

如:
local Upload = require 'bamboo.models.upload'
local newfile, result_type = Upload:process(web, req, 'logo/')


执行了这个之后,如果是单文件上传,则newfile就是创建的上传对象,里面的name, path, size, timestamp已经填充好了,desc还是'',result_type为'single';

如果是多文件上传(仅限html4,html5执行的总是单文件上传),则new_file是一个upload list,result_type是'multiple'。

获得了文件对象后,如果需要对其添加更多的信息,只需如下操作:

如:
newfile.desc = 'this is a picture.'
newfile:save()
即可。


Upload模型还可以被继承,比如,Bamboo定义了一个Image模型,就是继承自Upload,在其之上添加了width, height两个字段。要上传一个Image,并保存,只需:

如:
local Image = require 'bamboo.models.image'
local newimg, result_type = Image:process(web, req, 'logo/')
newimg.width = xxx;
newimg.height = yyy;
newimg.desc = 'zzzzzz';
newimg:save()  -- 别忘了执行最后的save方法

可以看到,process函数,只负责保存文件和在数据库中生成基本记录的作用,更多的信息(不管是desc字段,还是由于继承添加的更多字段),都是在返回的file object基础上操作的。

下面给出process接口的完整参数:

newfile, result_type = Upload:process(web, req, dest_dir, prefix, postfix)

web: web对象,必须;
req:req对象,必须;
dest_dir:保存的路径,可选;
prefix:文件的前缀,可选;
postfix:文件的后缀,可选。


Upload对html5上传的数据有一定要求,要求req.headers中有如下字段:

  1. x-requested-with  标明这是一个ajax请求
  2. x-file-name   上传的文件名放在这里面(这个需要与客户端js代码配合实现。是不是从query参数中获得此值更好,值得商榷)


enjoy.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics