分享

jspsmartupload上传文件中文乱码

 WindySky 2008-12-18
  采用jspsmartupload上传文件时,如果文件名含有中文,在服务器端取得文件名是会出现乱码。如果表单项中填写了中文,一样会有乱码问题。看了下jspsmartupload的源码,改了两个地方,现在可以没有乱码问题了。
  第一个地方,修改类SmartUpload中的upload()方法
 
Java代码 复制代码
  1. public void upload()   
  2.       throws SmartUploadException, IOException, ServletException   
  3.   {   
  4.       int totalRead = 0;   
  5.       int readBytes = 0;   
  6.       long totalFileSize = 0L;   
  7.       boolean found = false;   
  8.       String dataHeader = new String();   
  9.       String fieldName = new String();   
  10.       String fileName = new String();   
  11.       String fileExt = new String();   
  12.       String filePathName = new String();   
  13.       String contentType = new String();   
  14.       String contentDisp = new String();   
  15.       String typeMIME = new String();   
  16.       String subTypeMIME = new String();   
  17.       boolean isFile = false;   
  18.       m_totalBytes = m_request.getContentLength();   
  19.       m_binArray = new byte[m_totalBytes];   
  20.       for(; totalRead < m_totalBytes; totalRead += readBytes)   
  21.           try  
  22.           {   
  23.               m_request.getInputStream();   
  24.               readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);   
  25.           }   
  26.           catch(Exception e)   
  27.           {   
  28.               throw new SmartUploadException("Unable to upload.");   
  29.           }   
  30.   
  31.       for(; !found && m_currentIndex < m_totalBytes; m_currentIndex++)   
  32.           if(m_binArray[m_currentIndex] == 13)   
  33.               found = true;   
  34.           else  
  35.               m_boundary = m_boundary + (char)m_binArray[m_currentIndex];   
  36.   
  37.       if(m_currentIndex == 1)   
  38.           return;   
  39.       m_currentIndex++;   
  40.       do  
  41.       {   
  42.           if(m_currentIndex >= m_totalBytes)   
  43.               break;   
  44.           dataHeader = getDataHeader();   
  45.           m_currentIndex = m_currentIndex + 2;   
  46.           isFile = dataHeader.indexOf("filename") > 0;   
  47.           fieldName = getDataFieldValue(dataHeader, "name");   
  48.           if(isFile)   
  49.           {   
  50.               filePathName = getDataFieldValue(dataHeader, "filename");   
  51.               fileName = getFileName(filePathName);   
  52.               fileExt = getFileExt(fileName);   
  53.               contentType = getContentType(dataHeader);   
  54.               contentDisp = getContentDisp(dataHeader);   
  55.               typeMIME = getTypeMIME(contentType);   
  56.               subTypeMIME = getSubTypeMIME(contentType);   
  57.           }   
  58.           getDataSection();   
  59.           if(isFile && fileName.length() > 0)   
  60.           {   
  61.               if(m_deniedFilesList.contains(fileExt))   
  62.                   throw new SecurityException("The extension of the file is denied to be uploaded (1015).");   
  63.               if(!m_allowedFilesList.isEmpty() && !m_allowedFilesList.contains(fileExt))   
  64.                   throw new SecurityException("The extension of the file is not allowed to be uploaded (1010).");   
  65.               if(m_maxFileSize > (long)0 && (long)((m_endData - m_startData) + 1) > m_maxFileSize)   
  66.                   throw new SecurityException(String.valueOf((new StringBuffer("Size exceeded for this file : ")).append(fileName).append(" (1105).")));   
  67.               totalFileSize += (m_endData - m_startData) + 1;   
  68.               if(m_totalMaxFileSize > (long)0 && totalFileSize > m_totalMaxFileSize)   
  69.                   throw new SecurityException("Total File Size exceeded (1110).");   
  70.           }   
  71.           if(isFile)   
  72.           {   
  73.               com.jspsmart.upload.File newFile = new com.jspsmart.upload.File();   
  74.               newFile.setParent(this);   
  75.               newFile.setFieldName(fieldName);   
  76.               newFile.setFileName(fileName);   
  77.               newFile.setFileExt(fileExt);   
  78.               newFile.setFilePathName(filePathName);   
  79.               newFile.setIsMissing(filePathName.length() == 0);   
  80.               newFile.setContentType(contentType);   
  81.               newFile.setContentDisp(contentDisp);   
  82.               newFile.setTypeMIME(typeMIME);   
  83.               newFile.setSubTypeMIME(subTypeMIME);   
  84.               if(contentType.indexOf("application/x-macbinary") > 0)   
  85.                   m_startData = m_startData + 128;   
  86.               newFile.setSize((m_endData - m_startData) + 1);   
  87.               newFile.setStartData(m_startData);   
  88.               newFile.setEndData(m_endData);   
  89.               m_files.addFile(newFile);   
  90.           } else  
  91.           {       
  92.               /**  
  93.                * 原来的代码  
  94.                * String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1);  
  95.                */  
  96.             /**  
  97.              * 2009-9-17 修改 ,解决取得request的参数的中文编码问题  
  98.              */  
  99.               String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1"utf-8");   
  100.                  
  101.                  
  102.             m_formRequest.putParameter(fieldName, value);   
  103.           }   
  104.           if((char)m_binArray[m_currentIndex + 1] == '-')   
  105.               break;   
  106.           m_currentIndex = m_currentIndex + 2;   
  107.       } while(true);   
  108.   }   

  第二个地方,修改类SmartUpload中的getDataHeader()方法
Java代码 复制代码
  1. private String getDataHeader()   
  2.    {   
  3.        int start = m_currentIndex;   
  4.        int end = 0;   
  5.        int len = 0;   
  6.        boolean found = false;   
  7.        while(!found)    
  8.            if(m_binArray[m_currentIndex] == 13 && m_binArray[m_currentIndex + 2] == 13)   
  9.            {   
  10.                found = true;   
  11.                end = m_currentIndex - 1;   
  12.                m_currentIndex = m_currentIndex + 2;   
  13.            } else  
  14.            {   
  15.                m_currentIndex++;   
  16.            }   
  17.          
  18.            
  19.        //原始代码   
  20.        //String dataHeader = new String(m_binArray, start, (end - start) + 1);   
  21.        /**  
  22.         * 2008-9-17 解决文件名的中文乱码问题  
  23.         */  
  24.        String dataHeader = null;   
  25.     try {   
  26.         dataHeader = new String(m_binArray, start, (end - start) + 1,"utf-8");   
  27.     } catch (UnsupportedEncodingException e) {   
  28.         e.printStackTrace();   
  29.     }   
  30.        return dataHeader;           
  31.    } 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多