2008年10月20日 星期一

使用 apache fileupload (含中文亂碼修正)

之前上傳是使用SmartUpload, 原本是沒問題, 後來tomcat 更新之後.
上傳就出現亂碼, 在網路上花好幾天找解決方法, 但我都設不起來,
我就想下載新版SmartUpload, 後來才發現連SmartUpload網站都消
失了, SmartUpload大概也不會有人更新了. 所以我改用apache
的fileupload , 而且它還持續在更新中. 下面文章是我從各家好手
中的文章試出來, 然後匯整在一起來. 希望能幫大家的忙.
因為找資料試程式真的很辛苦.

一. 先到apache 網站下載 io 及 fileupload 元件
解壓縮後放到C:\Tomcat\webapps\ROOT\WEB-INF\lib 目錄中,
接著重開tomcat 就算成功完裝了.




二.測試上傳功能

<html>
<head>
<title>檔案上傳</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<b>檔案上傳</b></font></p>

<form name="UploadForm" enctype="multipart/form-data" method="post" action="test2.jsp">
<input type="file" name="File1" size="20" maxlength="20"> <br>
<input type="file" name="File2" size="20" maxlength="20"> <br>
<input type="submit"value="上傳">
</form>

</body>
</html>




接收上傳的頁面

<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.util.regex.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>

<%@page contentType="text/html;charset=UTF-8"%>
<%
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");

String enc = System.getProperty("file.encoding");

out.println(enc);
%>
<html>
<head>
<title>文件上傳處理頁面</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<%

DiskFileUpload fu = new DiskFileUpload();

fu.setSizeMax(2*1024*1024);

fu.setSizeThreshold(4096);
//先處存到暫存區
fu.setRepositoryPath(application.getRealPath("/") + "temp/");
//開始上處
List fileItems = fu.parseRequest(request);
// 依序處理上傳文件
Iterator iter = fileItems.iterator();

//檢查上傳的檔案格式
String regExp=".+\\\\(.+)$";

//拒絕文件類型
String[] errorType={".exe",".com",".cgi",".asp"};
Pattern p = Pattern.compile(regExp);
while (iter.hasNext()) {
FileItem item = (FileItem)iter.next();
//如果是request item 就在這接收
if (item.isFormField()){
String name = item.getFieldName();
String value = item.getString();
out.println("name:"+item.getFieldName());
out.println("value:"+item.getString("UTF-8"));
}

//如果是上傳檔案, 就在這接收

if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
if((name==null||name.equals("")) && size==0)
continue;
Matcher m = p.matcher(name);
boolean result = m.find();
if (result){
for (int temp=0;temp<errorType.length;temp++){
if (m.group(1).endsWith(errorType[temp])){
throw new IOException(name+": wrong type");
}
}
try{

//儲存檔案到指定位置


item.write(new File(application.getRealPath("/") + "temp/" + m.group(1)));

out.println(name+"  "+size+"<br>");
// out.println(new String(name.toString().getBytes(), "UTF-8")+"  "+size+"<br>");
}
catch(Exception e){
out.println(e);
}

%>
<TABLE class=text width=100% border=0>
<SCRIPT LANGUAGE="JavaScript">
function back(num)
{
num = num * (-1);

window.parent.frames[1].location.reload();
history.go(num);
}
</SCRIPT>

<TR>
<TD width="10%" >
<FORM METHOD="post">
<INPUT TYPE="button" VALUE="回上一頁" onClick="back(1)">

</FORM>
</TD>


</TR>
</table>
<%

}
else
{
throw new IOException("fail to upload");
}
}
}
%>
</body>
</html>

2 則留言:

Unknown 提到...

幫我解決了長久以來的問題....太感謝了

缺一角的圓 提到...
作者已經移除這則留言。