文件上传异常

原因:引起异常的原因是没有设置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才能完整的传递文件数据。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值