您的位置:首页 > 编程语言 > Java开发

java web 利用 commons-fileupload-1.2 实现文件上传 解决 中文乱码& 非文件属性的读取

2007-11-23 15:42 886 查看
//该类需要一个httpServletRequest作为参数.
//前面要导入fileupload和io包,都是apache的
public class FileUpload {
public void upLoad(HttpServletRequest request) throws ServletException,
IOException {
String uploadPath = "d://test//"; // 用于存放上传文件的目录,建议要先建好文件夹

String tempPath = "d://testTemp//"; // 用于存放临时文件的目录,建议要先建好文件夹

// 检查是否是个file的request请求.再form中enctype="multipart/form-data"来约束
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
throw new RuntimeException();
}
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// set temperoy memory size 4M
factory.setSizeThreshold(1024 * 1024 * 4);
// Sets the directory used to temporarily
factory.setRepository(new File(tempPath));
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// set the sigle file max 5G
//upload.setFileSizeMax(1024 * 1024 * 1024);
// set the request max size hG
upload.setSizeMax(1024 * 1024 * 1024);
// Parse the request

try {
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
//读取item
FileItem item = (FileItem) iter.next();
//得到表单中域的name 从上倒下.从左到右.页面
String fieldName = item.getFieldName();
//先判断该域是否为文件域,如果是返回false,再判断是否是没用的域.这里排除了submit这个域.不过这样把代码写死了.应该还有好的方法.大家一起来改进
if(item.isFormField()&&(!fieldName.equals("submit"))){

//打印域名
System.out.println(fieldName);

String value= item.getString();
//页面传的值都是iso-8859-1的.这里转一下下
value = new String(value.getBytes("ISO-8859-1"),"GB2312");
//打印域的value
System.out.println(value);

}
//else 这下都是文件域.就可以设置并保存了. 得到文件名称
String fileName = item.getName();

//判断该文件名称是否为空 ,防止多文件上传时候有空.
if (fileName != null) {
System.out.println(item.getFieldName());
fileName = fileName.substring(
fileName.lastIndexOf("//") + 1, fileName.length());

System.out.println(fileName);
item.write(new File(uploadPath + fileName));
System.out.println(fileName);
}
}
} catch (Exception e) {
}
}

下面是过滤器 我就不多说了
package web;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter{
private FilterConfig config;

public void init(FilterConfig config) throws ServletException {
this.config = config;
}

public FilterConfig getConfig() {
return config;
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//System.out.println("filter has been called");
String characterEncoding = config.getInitParameter("characterEncoding");
if(characterEncoding==null)characterEncoding = "GB2312";
request.setCharacterEncoding(characterEncoding);
response.setCharacterEncoding(characterEncoding);
chain.doFilter(request, response);
}

public void destroy() {
}
}

页面

<form onSubmit="return validate()" name="userForm" method="post"
action="file" enctype="multipart/form-data">
<input name="file" type="file" class="style4" value="" size="20">
<input name="file" type="file" class="style4" value="" size="20">
<input name="file" type="file" class="style4" value="" size="20">
<input name="file" type="file" class="style4" value="" size="20">
<input name="file" type="file" class="style4" value="" size="20">
<input name="name" type="text" >
<input name="key" type="text" >
<input name="pasword" type="text" >
<input name="des" type="text" >
<input name="tt" type="text" >

<input type="submit" value="上传" name="submit" class="s02">
</form>

web.xml

<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>web.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

余下导包和调用.就不说了.这里提2点不足.
1 没有实现进度条.一牵扯到ajax我就脑袋大
2 tomcat终端总是报
984 DEBUG ManagerBase:676 - Start expire sessions StandardManager at 1195803390984 sessioncount 0
15:36:30,984 DEBUG ManagerBase:685 - End expire sessions StandardManager processingTime 0 expired sessions: 0
15:37:31,265 DEBUG ManagerBase:676 - Start expire sessions StandardManager at 1195803451265 sessioncount 0
15:37:31,265 DEBUG ManagerBase:685 - End expire sessions StandardManager processingTime 0 expired sessions: 0
15:38:31,546 DEBUG ManagerBase:676 - Start expire sessions StandardManager at 1195803511546 sessioncount 0
15:38:31,546 DEBUG ManagerBase:685 - End expire sessions StandardManager processingTime 0 expired sessions: 0
15:39:31,859 DEBUG ManagerBase:676 - Start expire sessions StandardManager at 1195803571859 sessioncount 0
15:39:31,859 DEBUG ManagerBase:685 - End expire sessions StandardManager processingTime 0 expired sessions: 0
不停的报.不知道谁知道答案可以告诉我.我的QQ14617107
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐