原因:引起异常的原因是没有设置MIME的编码,不能完整的传递文本数据!!!
工程中使用到以下两个jar包:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
upload.jsp:
在form标签中没有加入entype="multipart/form-data"之前:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'upload.jsp' starting page</title>
</head>
<body>
<!-- entype="multipart/form-data" -->
<form action="${pageContext.request.contextPath}/UploadServlet" method="post">
上传用户:<input type="text" name="username"><br/>
上传文件1:<input type="file" name="filed1"><br/>
上传文件2:<input type="file" name="filed2"><br/>
<input type="submit" value="上传">
</form>
</body>
</html>
UploadServlet:
package cn.lsh.servlet;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@SuppressWarnings("serial")
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
//创建解析工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建解析器
ServletFileUpload file = new ServletFileUpload(factory);
//调用解析器解析request,得到保存了所有上传数据的list
List<FileItem> list = file.parseRequest(request);
//迭代list集合,拿到封装每个输入项数据的filename
for(FileItem item: list){
//判断item类型,如果是普通字段,则直接获取,如果为上传文件,则调用流获取数据写到硬盘
if(item.isFormField()){
String inputName = item.getFieldName();
String inputValue = item.getString();
System.out.println(inputName+"="+inputValue);
}else{
//item封装的是上传文件
String filename = item.getName().substring(item.getName().lastIndexOf("\\")+1);
InputStream in = item.getInputStream();
int len = 0;
byte [] by = new byte[1024];
FileOutputStream out = new FileOutputStream("c:\\"+filename);
while((len=in.read())>0){
out.write(by,0,len);
}
in.close();
out.close();
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
浏览器输出提示:服务器500异常。
type Exception report
message org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded
description The server encountered an internal error that prevented it from fulfilling this request.
exception
java.lang.RuntimeException: org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded cn.lsh.servlet.UploadServlet.doGet(UploadServlet.java:51) cn.lsh.servlet.UploadServlet.doPost(UploadServlet.java:57) javax.servlet.http.HttpServlet.service(HttpServlet.java:643) javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。 multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分,上传附件用到 text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。 enctype="multipart/form-data是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form- data,才能完整的传递文件数据,进行下面的操作.
总结:
引起异常的原因是:当你在提交form表单的数据,他默认的编码格式是application/x-www-form-urlencoded,这个是不能用于上传文件的,所以要设置表单的MIME编码,当设置表单的MIME编码enctype="multipart/form-data才能完整的传递文件数据。