每日一得

不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速开发
最近关心的内容:SSH,seam,flex,敏捷,TDD
本站的官方站点是:颠覆软件

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  220 随笔 :: 9 文章 :: 421 评论 :: 0 Trackbacks
key words: 上传文件

目里面有上传文件的需求,我想了一下不外乎下面两种处理方法:

1. 在数据库表中建立一个blob字段存放用户上传文件.
2. 在服务器上建立一个文件夹保存用户上传文件,数据库表中只存放该文件的url地址.

我本人现在比较倾向于第2种方案, 主要原因是担心方案1的效率(我用的是mysql数据库)。 但是处理过程中除了维护数据库中表的字段还要维护上传的文件,稍微麻烦一点。

大家在项目里面又是怎么做呢? 给我点建议!谢谢


讨论内容见: javaeye

robin更建议第二种方案,放在数据库中主要的问题是 AppServer吃不消,开销比较大.

上面是摘录,不过我们这里用的是Oracle9i AS,在Oracle的协作套间里一般文档或者上传的文件都是保存在数据库里,还把这个特性作为Oracle 与别的协作套件之间不同的卖点。

大家以为如何? 我直觉是Oracle的DB和oc4j的AppServer对付这个似乎没有开销上的担心,但是没有实际检测过。

换句话说,文件的管理是放在文件夹里方便还是数据库里方便? 有点为难

update (2007-5-13):
还有一种方案结合了数据库和IO,我认为比较可行,就是文件存在数据库,但是下载的时候第一次从数据库下载,然后第一次这个文件保存在一个临时文件夹下面,以后每次下载的时候总是先检查此临时文件夹,如果已经存在则直接下载,如果没有则从数据库重复这个动作。当然,保存在临时文件夹下的文件的命名需要唯一,这个应该没有问题。
posted on 2007-01-31 09:06 Alex 阅读(1950) 评论(4)  编辑  收藏 所属分类: javaweb技术Oracle

评论

# re: [讨论]上传文件放在哪里比较合适?[未登录] 2007-01-31 10:49 hut
同样为难。如果用第二种方案,最好还要将文件压缩或者改变格式。否则在系统中对权限有限制的文件,管理员从硬盘上就能看到。  回复  更多评论
  

# re: [讨论]上传文件放在哪里比较合适? 2007-01-31 10:59 Yinzhe
选择起来是很困难的  回复  更多评论
  

# re: [讨论]上传文件放在哪里比较合适? 2007-01-31 11:17 BeanSoft
数据库反应速度比 Apache 慢不知道多少倍去了... 照这样说新闻站点都不要做静态页面了, 都入库得了. 但是大站的, 如 163, sohu, sina, 新闻都是静态的页面, 只有评论才会入库. 软件下载站一个软件就500MB, 你再入库...反正静态内容存硬盘 + 数据库记录管理 是不二的选择.  回复  更多评论
  

# re: [讨论]上传文件放在哪里比较合适? 2007-02-01 15:39 BeanSoft
还有个问题就是 Mysql 存储大文件的问题. 根据你的情况我基本上断定是有点不太现实了:
在MySQL3.23时(新版也是),最大允许的信息包是16MB,从4.0.1及以上版本后,该值改为了1GB。而在使用时允许值是通过max_allowed_packet来设置的,一般来说,在客户端和服务端都会有自己的#max_allowed_packet变量,所以要改变在信息交换中使用信息包的允许大小,就要正确设置客户端及服务端的max_allowed_packet变量。
  如果使用mysql的客户包,那么其默认值是16MB,则可以通过以上方式来启动mysql:
#mysql> mysql --max_allowed_packet=32M

  如果使用服务包,那么该值默认是1MB,通过以下方式启动:
#mysql> mysqld --max_allowed_packet=16M
对于4.0以前的mysql应该使用
#mysql> mysqld --set-variable=max_allowed_packet=16M
也可以在配置文件中使用
[mysqld]
max_allowed_packet=16M
指定信息包大小,注,4.0以前用
[mysqld]
set-variable = max_allowed_packet=16M  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: