您的位置:首页 > 运维架构 > Apache

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();
        }
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息