Java日记之Servlet基础二(文件上传)

在使用servlet上传普通控件时 ,是否指定enctype都无所谓 ,但是当上传文件时,情况就不一样了

实现思路

①在上传时 ,我们必须在form表单上指定enctypemultipart /form-data

②同时需要重写doPost(); [因为前端传的是文件,所以我们不能getParameter()]

③创建一个磁盘文件项工厂DiskFileItemFactory类 的对象factory
和服务文件上传ServletFileUpload load = new ServletFileUpload(factory) (以factory为参数)

④再创建一个文件迭代器去获取每一个文件 :
FileItemIterator iter = upload.getItemIterator(request)

⑤设置一个while循环迭代文件 ,同时将文件流变成输出流
FileItemStream stream = iter.next();
InputStream input = stream.openStream();

⑥进行一次判断 ,判断传来的表单里是否包含普通控件 ,有普通控件的 ,看⑧,只有< input type=“file”>的 ,看⑨

  • ⑧ 1.先将字节流转换为字符流 ,使用InputStreamReader
    2.定义一个带缓冲区的流对象BufferedReader bf = new BufferedReader(reader);
    3.使用readLine()方法, 一次读一行.
    4.使用stream.getFieldName()方法 ,根据name值去区分数据

  • ⑨在我们把文件上传以后 ,有两种存储方式 ,一是存在服务器的硬盘 , 并且会对应上路径 / 图片名**(往往头像是按这种存储方式)**,
    二是存在服务器的数据库中 ,在查询的时候性能较差
    操作流程 : 1.先使用request对象的getRealPath()方法获取存储路径
    2.再使用stream对象的getName()方法获取上传文件名
    3.将两者和后缀拼接在一起 ,生成一个新的文件名
    4.定义一个输出流,将生成的名字作为文件名OutputStream out = new FileOutputStream (path+ timestamp + suffix);
    5.设置缓冲区 ,将输入和输出流对接上 ,传完以后关闭文件

代码

好气啊method拼错了传了一天没传上去,下面的是正确代码
//servlet

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.http.fileupload.FileItemIterator;
import org.apache.tomcat.util.http.fileupload.FileItemStream;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class DealServlet
 */
public class DealServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DealServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("UTF-8");
		//创建磁盘文件工厂对象
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//创建服务文件上传对象
		ServletFileUpload upload = new ServletFileUpload(factory);
		//创建一个文件迭代器
		try {
			FileItemIterator iter = upload.getItemIterator(request);
			while (iter.hasNext()) {
//				System.out.println("开始处理文件上传");
				//创建一个文件迭代流接受迭代器返回的文件对象
				FileItemStream stream = iter.next();
				//再把文件迭代流变成输入流(使用openStream()方法)
				InputStream input = stream.openStream();
				//判断是否为 普通控件
				if (stream.isFormField()) {
					//是普通控件
//					System.out.println("含普通控件");
					//使用特殊方式去处理   普通控件
					//InputStreamReader 用于把字节流转成字符流
					InputStreamReader reader = new InputStreamReader(input,"UTF-8");
					//input 是字节流     转成字符流 就能够获取到字符
					BufferedReader bf = new BufferedReader(reader);
					//读取一行 的字符
					String name = bf.readLine();
					//stream.getFieldName()  取到name ,, 根据name去分辨
					System.out.println(stream.getFieldName()+name);
					
					input.close();
					
				} else {
					//是文件控件<type ="file">
					//获取实际发布路径
					String path = request.getRealPath("/");;
					System.out.println(path);//输出发布路径查看是否成功上传
					
					//重新定义文件名字
					String oldName = stream.getName();//取出文件名
					System.out.println(oldName);
					long timestamp = System.currentTimeMillis();
//					String oldName = stream.getName();
					
//					String mainPart = timestamp;// 用UUID取到一个唯一的值
					String suffix = oldName.substring(oldName.lastIndexOf('.'));
//					String newName = path+mainPart+suffix;
//					System.out.println(newName);
					
					//存在服务器硬盘上
					OutputStream out =new FileOutputStream(path+timestamp+suffix);
					byte[] buf = new byte[1024];//设置缓冲区
					int length =0;
					while((length =input.read(buf))!=-1) {
						out.write(buf,0,length);
					}
					input.close();
					out.close();
					
					//将图片名字写入数据库
					
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

//jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>                                                  
	<form action ="DealServlet" method ="post" enctype ="multipart/form-data">
		
		用户名<input type ="text" name ="name">
		真实姓名<input type ="text" name ="realName">
		<input type ="file" name="myFile"/>
		<input type="submit" value ="上传文件">
	</form>
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值