Web环境下的文件上传与Apache Common FileUpload组件
2006-03-24 10:58
555 查看
这两天Master组在Enhydra Application里尝试上传12M左右的一个CSV文件碰到内存溢出、乱码等等问题,于是试用了一下Apache Common FileUpload组件,谈谈两点心得:
默认情况下,该组件将不做任何改动地上传源文件,类似于FTP中的二进制模式。假设客户端使用日文版Windows2K/XP,默认字符集为MS932;服务器使用默认字符集为EUC_JP的Linux系统,如果源文件是MS932编码的文本文件,那么上传到服务器后仍然会是MS932编码的文本文件,大小和内容都不会有变化。
为什么使用Apache Common FileUpload组件后没有出现内存溢出现象?虽然没有仔细研究源代码,不过估计它对较小的文件就直接采用in memory方式,而对较大的文件可能会在内存占用过大时将内存中的部分或全部信息写入临时文件以防内存溢出。
如果想上传的同时转换一下源文件的编码,可以参考下列代码(感谢邓XX提供源代码):
private void processUploadedFile(FileItem item) throws Exception {
String fileName = new File(item.getName()).getName();
//item.write(new File(UPLOADPATH + fileName)); //用下面的代码代替
InputStreamReader ir =
new InputStreamReader(item.getInputStream(),"JISAutoDetect");
BufferedReader br = new BufferedReader(ir);
FileOutputStream fos = new FileOutputStream(UPLOADPATH + fileName);
OutputStreamWriter osw = new OutputStreamWriter(fos, "EUC_JP");
BufferedWriter bw = new BufferedWriter(osw);
try {
String data = null;
while ((data = br.readLine()) != null) {
bw.write(data);
bw.newLine();
}
} finally {
bw.close();
osw.close();
fos.close();
br.close();
ir.close();
}
}
默认情况下,该组件将不做任何改动地上传源文件,类似于FTP中的二进制模式。假设客户端使用日文版Windows2K/XP,默认字符集为MS932;服务器使用默认字符集为EUC_JP的Linux系统,如果源文件是MS932编码的文本文件,那么上传到服务器后仍然会是MS932编码的文本文件,大小和内容都不会有变化。
为什么使用Apache Common FileUpload组件后没有出现内存溢出现象?虽然没有仔细研究源代码,不过估计它对较小的文件就直接采用in memory方式,而对较大的文件可能会在内存占用过大时将内存中的部分或全部信息写入临时文件以防内存溢出。
如果想上传的同时转换一下源文件的编码,可以参考下列代码(感谢邓XX提供源代码):
private void processUploadedFile(FileItem item) throws Exception {
String fileName = new File(item.getName()).getName();
//item.write(new File(UPLOADPATH + fileName)); //用下面的代码代替
InputStreamReader ir =
new InputStreamReader(item.getInputStream(),"JISAutoDetect");
BufferedReader br = new BufferedReader(ir);
FileOutputStream fos = new FileOutputStream(UPLOADPATH + fileName);
OutputStreamWriter osw = new OutputStreamWriter(fos, "EUC_JP");
BufferedWriter bw = new BufferedWriter(osw);
try {
String data = null;
while ((data = br.readLine()) != null) {
bw.write(data);
bw.newLine();
}
} finally {
bw.close();
osw.close();
fos.close();
br.close();
ir.close();
}
}
相关文章推荐
- Common FileUpload远程web文件上传问题
- 文件上传 使用apache common-fileupload.jar
- JSP使用Common FileUpload组件实现文件上传及限制上传类型实例代码
- 开源Common FileUpload远程web文件上传问题
- 开源Common FileUpload远程web文件上传问题
- WEB文件上传之apache common upload使用(一)
- (8)common-upload文件上传出现org.apache.commons.fileupload.FileUploadBase$IOFileUploadException
- commonfileupload组件文件上传
- 使用WebClient.UpLoadFile方法在C/S程序中上传文件
- MVC文件上传04-使用客户端jQuery-File-Upload插件和服务端Backload组件实现多文件异步上传
- AjaxFileUpload文件上传组件(php+jQuery+ajax)
- 上传文件出错:org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
- 利用Jakarta commons fileupload组件实现多文件上传
- Struts2上传文件报错Unable to parse request org.apache.commons.fileupload.FileUploadBase$IOFileUploadExcept
- 利用Jakarta commons fileupload组件实现多文件上传
- apache uploadfile 文件上传注意事项
- 关于上传组件jspsmart和commonfileupload的一些感触!!
- 解决CommonFileUpload上传文件不能获取多选框
- MVC文件上传09-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹,并在其中创建分类子文件夹
- Apache Commons fileUpload实现文件上传