读书人

[jspSmartUpload]-gt;jspSmartUpload下传

发布时间: 2012-12-22 12:05:06 作者: rapoo

[jspSmartUpload]------------>jspSmartUpload上传中文文件名 乱码问题
用jspSmartUpload做文件上传下载,该组件默认是不是utf-8编码,对中文支持不好,当文件名或参数有中文时候就会出现乱码。在google一番后找到一种目前比较好的解决方案
修改源码(听说是侵权,但....)
找到源码,并且参考网上的讲法,进行修改,发现可以解决

1)当页面上传有参数时,中文会乱码,解决页面上中文参数乱码方法:
修改类SmartUpload()中的upload()方法
(可以按照关键字 application/x-macbinary 定位到)

    public void upload()        throws SmartUploadException, IOException, ServletException    {        int totalRead = 0;        int readBytes = 0;        long totalFileSize = 0L;        boolean found = false;        String dataHeader = new String();        String fieldName = new String();        String fileName = new String();        String fileExt = new String();        String filePathName = new String();        String contentType = new String();        String contentDisp = new String();        String typeMIME = new String();        String subTypeMIME = new String();        boolean isFile = false;        m_totalBytes = m_request.getContentLength();        m_binArray = new byte[m_totalBytes];        for(; totalRead < m_totalBytes; totalRead += readBytes)            try            {                m_request.getInputStream();                readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);            }            catch(Exception e)            {                throw new SmartUploadException("Unable to upload.");            }        for(; !found && m_currentIndex < m_totalBytes; m_currentIndex++)            if(m_binArray[m_currentIndex] == 13)                found = true;            else                m_boundary = m_boundary + (char)m_binArray[m_currentIndex];        if(m_currentIndex == 1)            return;        m_currentIndex++;        do        {            if(m_currentIndex >= m_totalBytes)                break;            dataHeader = getDataHeader();            m_currentIndex = m_currentIndex + 2;            isFile = dataHeader.indexOf("filename") > 0;            fieldName = getDataFieldValue(dataHeader, "name");            if(isFile)            {                filePathName = getDataFieldValue(dataHeader, "filename");                fileName = getFileName(filePathName);                fileExt = getFileExt(fileName);                contentType = getContentType(dataHeader);                contentDisp = getContentDisp(dataHeader);                typeMIME = getTypeMIME(contentType);                subTypeMIME = getSubTypeMIME(contentType);            }            getDataSection();            if(isFile && fileName.length() > 0)            {                if(m_deniedFilesList.contains(fileExt))                    throw new SecurityException("The extension of the file is denied to be uploaded (1015).");                if(!m_allowedFilesList.isEmpty() && !m_allowedFilesList.contains(fileExt))                    throw new SecurityException("The extension of the file is not allowed to be uploaded (1010).");                if(m_maxFileSize > (long)0 && (long)((m_endData - m_startData) + 1) > m_maxFileSize)                    throw new SecurityException(String.valueOf((new StringBuffer("Size exceeded for this file : ")).append(fileName).append(" (1105).")));                totalFileSize += (m_endData - m_startData) + 1;                if(m_totalMaxFileSize > (long)0 && totalFileSize > m_totalMaxFileSize)                    throw new SecurityException("Total File Size exceeded (1110).");            }            if(isFile)            {                com.jspsmart.upload.File newFile = new com.jspsmart.upload.File();                                newFile.setParent(this);                newFile.setFieldName(fieldName);                newFile.setFileName(fileName);                newFile.setFileExt(fileExt);                newFile.setFilePathName(filePathName);                newFile.setIsMissing(filePathName.length() == 0);                newFile.setContentType(contentType);                newFile.setContentDisp(contentDisp);                newFile.setTypeMIME(typeMIME);                newFile.setSubTypeMIME(subTypeMIME);                if(contentType.indexOf("application/x-macbinary") > 0)                    m_startData = m_startData + 128;                newFile.setSize((m_endData - m_startData) + 1);                newFile.setStartData(m_startData);                newFile.setEndData(m_endData);                m_files.addFile(newFile);            } else            {//    源码为://  String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1);//             在原来的基础上定义字符编码utf-8             String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1, "UTF-8");                m_formRequest.putParameter(fieldName, value);            }            if((char)m_binArray[m_currentIndex + 1] == '-')                break;            m_currentIndex = m_currentIndex + 2;        } while(true);    }



2) 当上传时文件名为中文时,解决中文乱码方法
修改类SmartUpload()中的getDataHeader()方法
    private String getDataHeader()    {        int start = m_currentIndex;        int end = 0;        int len = 0;        boolean found = false;        while(!found)             if(m_binArray[m_currentIndex] == 13 && m_binArray[m_currentIndex + 2] == 13)            {                found = true;                end = m_currentIndex - 1;                m_currentIndex = m_currentIndex + 2;            } else            {                m_currentIndex++;            }        String dataHeader = null;/*** 源码为:*   dataHeader = new String(m_binArray, start, (end - start) + 1);*/        try {//指定编码方式为utf-8dataHeader = new String(m_binArray, start, (end - start) + 1,"utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}        return dataHeader;    }


目前上面的方法可以满足自己在项目中的需求,有兴趣的朋友可以自己下载自己看看源码,或者直接用我改好的先用用
楼主,啥也不说了~~~
那啥不言谢`` 2 楼 yxyysu 2012-05-21 下载之后使用了,没有解决上传时中文名字乱码问题,请博主指导。

读书人网 >JavaScript

热点推荐