首页 > 比较推荐的文件上传模式是什么

比较推荐的文件上传模式是什么

假设后台一个model除了普通文本属性包含文件(以图片为例):

class Target{
    string name;
    string description;
    file[] photos
}

一般情况下,增加对象通过普通的表单就可以

<input name='target.name' ...../>
...
<input name='target.photos[0]' type="file" ...../>
<input name='target.photos[1]' type="file"...../>

对于更新的表单,普遍是跟增加表单一样的,无非就是对已有记录进行数据绑定,但是涉及到文件之类就有区别了:
1 对于file类型的input元素服务端无能为力
普通input元素,不论是通过服务端标签还是前段js都可以动态设置他的属性并展示给用户,但是对于type=file的元素,好像是不能的吧,这样的话,用户就没法看到已有记录到底有没有文件。
2 文件预览
对于增加的时候:没法做(不采用html5方式的话)
对于更新的时候:因为后台有记录,可以通过js方式做
即使采用两台html5的方式,表示方式也不统一。

我目前的办法是所有文件上传由单独的controller控制,换句话说,在进行一个model表单提交(增加或更新)的时候,首先通过ajax方式提交文件,然后得到文件的表示(id等),再放到model的属性里,提交model。
这样的话,无论是增加还是更新,服务端采用标签或者客户端采用js进行数据绑定逻辑都是一样的,因为这些文件的id就是普通的字符串,当然对于有文件的情况下,通过js进行预览。

这样的话model需要做一定的变化

class Target{
    string name;
    string description;
    file[] photos
    string[] photo_ids;
}

表单:

<input name='target.name' ...../>
...
<input name='target.photo_ids[0]' type="text" ...../>
<input name='target.photo_ids[1]' type="text"...../>

这样比第一种方式会灵活一点。但是比如photo_ids这个字段,是没有语义上的意义的,他就是为了解决这个上传的纯技术问题而出现的,所以还是感觉有点不足。还有,这种方式通过ajax提交文件,貌似ajax不支持文件上传,需要通过iframe这种方式,或者借助于浏览器特性?如果这样的话,在ajax没有普及之前,大家是怎么做的?

最后就是类似这样,选中文件就立即上传,然后预览,这也是一种方式,在用户选错的情况下没有返回的余地。

个人不太确定现在行业里面主流都是采用什么方式做的,希望有经验的同志们不吝赐教。

【热门文章】
【热门文章】