Java 文件上传
在Java Web开发中,文件上传功能是经常用到的功能,当然网上相应的也有不少好的开发源组件,常用的比较多的的apache.common.fileupload,SmartUpload,cos.
当然这三个组件的功能基本上差不多,但某些方面还是有一些差别,现将三者对比如下:
对比项 | 是否一次加载到内存 | 上传方式 | 解析原理 | 应用场景 | 优缺点 |
fileupload | 根据设定,可一次将request流读取内存,然后从内存中抽取各文件部分。也可边读取流边解析保存文件到硬盘 | 可一次读入, 也可边保存边读取 | RFC1867 | 文件较大,边解析边保存 | |
smartupload | 一次将request流读取内存,然后从内存中抽取各文件部分 | 一次全部读取文件到内存 | RFC1867 | 文件比较小(100M以下),对内存要求不高 | 当文件较大时,容易内存溢出 |
cos | 根据设定,可一次将request流读取内存,然后从内存中抽取各文件部分。也可边读取流边解析保存文件到硬盘 | 可一次读入, 也可边保存边读取 | RFC1867 | 文件较大,边解析边保存 |
当然,我平时用SmartUpload比较大,主要是因为上传的文件不是太大(小于100M),一般情况也可以满足业务要求.但如果要为SmartUpload也改造成像fileupload或cos一样可以边读取流,边保存文件,就需要修改SmartUpload 源文件中SmartUpload的upload方法,按照RFC1867协议规范,读取request流,根据分隔线抽取出form表单项和文件部分.然后将文件边读取边保存到硬盘上指定目录。具体代码可参考cos源码。(fileupload区分文件部分写的比较隐晦,本人看了一段时间还未能弄明白基分割文件原理,应该说跟cos差不多,按RFC1867协议解析)