日期:2014-05-16  浏览次数:20356 次

jspSmartUpload组件上传下载文件时中文乱码问题(转)

??? 这次用jspSmartUpload做文件上传下载,该组件默认是GBK编码,当上传的文件名为中文时,我将文件名getBytes()下,将GBK改成 UTF-8。测试了下,貌似没问题,突然有一次上传一文件时,发现最后几个字乱码,一直是??。在拿些文件测试,后来知道了是当文件名为中文奇数时,会乱 码,而且还上传不了。再做测试,找原因,查看字符的长度,转成16进制看结果。觉得是jspSmartUpload组件对中文支持不足的问题。

??? 在网上找解决方法。下了几个jar,都说解决中文乱码,彻底解决中文乱码!!!用到我这就都不管用,而且也看到很多回复说解决不了,乱码问题还是依旧!!!

??? 这次自己找到jspSm的源代码,参考了网上的意见,自己稍微修改了下。发现能解决中文乱码问题,分享给和我遇到同样问题的朋友们!!!

?

????????1:当页面上传有参数时,中文会乱码,解决页面上中文参数乱码方法:

????????????修改类SmartUpload()中的upload()方法?????????

public void upload() throws ServletException,IOException,SmartUploadException {
        int i = 0;
        //boolean flag = false;
        boolean flag1 = false;
        //boolean flag2 = false;
        long l = 0L;
        //String s = "";//new String();
        //String s2 = "";//new String();
        String s4 = ""; //new String();
        String s5 = ""; //new String();
        String s6 = ""; //new String();
        String s7 = ""; //new String();
        String s8 = ""; //new String();
        String s9 = ""; //new String();
        String s10 = ""; //new String();
        m_totalBytes = m_request.getContentLength();
        m_binArray = new byte[m_totalBytes];
        int j;
        for(;i < m_totalBytes;i += j)
        {
            try
            {
                m_request.getInputStream();
                j = m_request.getInputStream().read(m_binArray,i,m_totalBytes - i);
            }
            catch(Exception exception)
            {
                throw new SmartUploadException("Unable to upload.");
            }
        }

        for(;!flag1 && m_currentIndex < m_totalBytes;m_currentIndex++)
        {
            if(m_binArray[m_currentIndex] == 13)
            {
                flag1 = true;
            }
            else
            {
                m_boundary = m_boundary + (char)m_binArray[m_currentIndex];
            }
        }
        if(m_currentIndex == 1)
        {
            return;
        }
        for(m_currentIndex++;m_currentIndex < m_totalBytes;m_currentIndex = m_currentIndex + 2)
        {
            String s1 = getDataHeader();
            m_currentIndex = m_currentIndex + 2;
            boolean flag3 = s1.indexOf("filename") > 0;
            String s3 = getDataFieldValue(s1,"name");
            if(flag3)
            {
                s6 = getDataFieldValue(s1,"filename");
                s4 = getFileName(s6);
                s5 = getFileExt(s4);
                s7 = getContentType(s1);
                s8 = getContentDisp(s1);
                s9 = getTypeMIME(s7);
                s10 = getSubTypeMIME(s7);
            }
            getDataSection();
            if(flag3 && s4.length() > 0)
            {
                if(m_deniedFilesList.contains(s5))
                {
                    throw new SecurityException("The extension of the file is denied to be uploaded (1015).");
                }
                if(!m_allowedFilesList.isEmpty() && !m_allowedFilesList.contains(s5))
                {
                    throw new SecurityException("The extension of the file is not allowed to be uploaded (1010).");
                }
                if(m_maxFileSize > 0L && (long)((m_endData - m_startData) + 1) > m_maxFileSize)
                {
                    throw new SecurityException("Size exceeded for this file : " + s4 + " (1105).");
                }
                l += (m_endData - m_startData) + 1;
                if(m_totalMaxFileSize > 0L && l > m_totalMaxFileSize)
                {
                    throw new SecurityException("Total File Size exceeded (1110).");
                }
            }
            if(flag3)
            {
                SmartFile file = new SmartFile();
                file.setParent(this);
                file.setFi