jspsmartupload utf 8サポート


多くの友达がこのアップロードダウンロードコンポーネントを使ったことがあると思いますが、このコンポーネントのデフォルトで使われているコードはgb 2312なので、あなたのページがutf-8であれば、文字化けなどの問題が発生します.ここでは、utf-8符号化のアップロードとダウンロードをサポートする方法を修正しました.興味のある方は以下の方法で自分で作って、面倒な方はそのままダウンロードして使えばいいです.
具体的な変更手順は次のとおりです.
(1)SmartUploadクラスでのupload()メソッドの修正
この文を見つけて、utf-8を含む次の文に変更します.太めの注意
 
//String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1);

String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1,"UTF-8");

 
(2)SmartUploadクラスでのgetDataHeader()メソッドを修正する.太めの注意
String s=new String(m_binArray,i,(j-i)+1);次のように変更します.
 
//String s = new String(m_binArray, i, (j - i) + 1);
String s=null;
try{
     String encode=m_response.getCharacterEncoding();
     if(encode.equalsIgnoreCase("UTF-8")){
             s = new String(m_binArray, i, (j - i) + 1,"UTF-8");
     }else{
             s = new String(m_binArray, i, (j - i) + 1);
     }
}catch(UnsupportedEncodingException e){
      e.printStackTrace();
}
return s;

これによりutf-8符号化のアップロード問題が解決される.次はutf-8符号化のダウンロード問題で、以下のように変更されます.
(1)メソッドUtf 8 String(String s)を追加
 
/**
             *           UTF8    ,                .
             * sinye   2010 1 29 
             * @param s     
             * @return          
             */
            public static  String Utf8String(String s)
        	{
        		StringBuffer sb = new StringBuffer();
        		for (int i=0;i<s.length();i++)
        		{
        				char c = s.charAt(i);
        				if (c >= 0 && c <= 255)
        				{
        					sb.append(c);
        				}
        				else
        				{
        						byte[] b;
        						try
        						{
        							b = Character.toString(c).getBytes("utf-8");
        						}
        						catch (Exception ex)
        						{
        							System.out.println(ex);
        							b = new byte[0];
        						}
        						for (int j = 0; j < b.length; j++)
        						{
        							int k = b[j];
        							if (k < 0) k += 256;
        							sb.append("%" + Integer.toHexString(k).toUpperCase());
        						}
        				}
        		}
        			return sb.toString();
        	}

 
(2)downloadFile(String s,String s 1,String s 2,int i)メソッドを修正し、太字部分に注意
 
public void downloadFile(String s, String s1, String s2, int i) throws ServletException, IOException, SmartUploadException {
/* 528*/        if (s == null) {
/* 528*/            throw new IllegalArgumentException("File '" + s + "' not found (1040).");
                }
/* 531*/        if (s.equals("")) {
/* 531*/            throw new IllegalArgumentException("File '" + s + "' not found (1040).");
                }
/* 534*/        if (!isVirtual(s) && m_denyPhysicalPath) {
/* 535*/            throw new SecurityException("Physical path is denied (1035).");
                }
/* 539*/        if (isVirtual(s)) {
/* 539*/            s = m_application.getRealPath(s);
                }
/* 544*/        File file = new File(s);
/* 545*/        FileInputStream fileinputstream = new FileInputStream(file);
/* 547*/        long l = file.length();
/* 548*/        boolean flag = false;
/* 549*/        int k = 0;
/* 550*/        byte abyte0[] = new byte[i];
/* 553*/        if (s1 == null) {
/* 554*/            m_response.setContentType("application/x-msdownload");
                } else
/* 555*/        if (s1.length() == 0) {
/* 556*/            m_response.setContentType("application/x-msdownload");
                } else {
/* 558*/            m_response.setContentType(s1);
                }
/* 561*/        m_response.setContentLength((int)l);
/* 563*/        m_contentDisposition = m_contentDisposition != null ? m_contentDisposition : "attachment;";
/* 567*/        if (s2 == null) {
/* 567*/            m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + Utf8String(getFileName(s)));
                } else
/* 569*/        if (s2.length() == 0) {
/* 570*/            m_response.setHeader("Content-Disposition", m_contentDisposition);
                } else {
/* 572*/            m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + Utf8String(s2));
                }
/* 577*/        while ((long)k < l)  {
/* 577*/            int j = fileinputstream.read(abyte0, 0, i);
/* 578*/            k += j;
/* 579*/            m_response.getOutputStream().write(abyte0, 0, j);
                }
/* 581*/        fileinputstream.close();
            }

これにより、ダウンロード時のutf-8符号化の問題が解決する.そして自分でjarファイルに電話すればOKです.
 
 
また、ダウンロード時にこのようなエラーが発生します:org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response
解決策は、コードを参照してください.
 
String file = request.getParameter("file"); 
su.downloadFile(file); 


//   java.lang.IllegalStateException: 
//getOutputStream() has already been called for this response 
//     
out.clear(); 
out=pageContext.pushBody(); 

jsp containerは、要求の処理が完了するとreleasePageContetメソッドを呼び出して使用するPageContext objectを解放し、getWriterメソッドを同時に呼び出すため、getWriterメソッドはjspページでストリームを使用するgetOutputStreamメソッドと競合するため、jspページの最後に2つの文を追加する必要がある:out.clear(); out=pageContext.pushBody();(アウト、pageContextはjsp内蔵オブジェクト!)