文件上传异常

来源:互联网 发布:windows cmd关机命令 编辑:程序博客网 时间:2024/06/07 19:34

原因:引起异常的原因是没有设置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,得到保存了所有上传数据的listList<FileItem> list = file.parseRequest(request);//迭代list集合,拿到封装每个输入项数据的filenamefor(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-urlencodedcn.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才能完整的传递文件数据。
0 0
原创粉丝点击