java_web:文件上传操作

文件上传操作

a.jsp表单提交页面注意事项(3个属性需要注意)

1.enctype="multipart/form-data":
		普通表单提交默认enctype="application/x-www-form-urlencoded";但是当表单中存在文件类型时,需要设置enctype="multipart/form-data",
	它不对字符进行编码,用于发送二进制的文件(即所有文件类型,如视频、图片、音乐、文档都可以用此类型enctype);还有一种enctype="text/plain"用于发送纯文本内容。
2.method="post":
		表单请求方式必须为post。
3.input type="file":
		文件表单内容的类型应设置为为文件类型。

b.设置指定上传目录应注意的问题(tomcat中上传目录丢失问题)

a.若将上传目录放在tomcat目录
		1.如果修改代码,则在tomcat重新启动时,会被删除。
			原因:当修改代码的时候,tomcat会重新编译一份class并且重新部署(重新创建各种目录)
		2.如果不修改代码,则不会删除
			原因:没有修改代码,class仍然时之前的class
b.为防止上传目录丢失:
		1.将上传目录部署到非tomcat目录即可(推荐做法)
		2.使用虚拟路径来部署上传目录

c.使用fileUpload固定步骤:
1.创建工厂类:DiskFileItemFactory factory=new DiskFileItemFactory();
2.创建解析器:ServletFileUpload upload=new ServletFileUpload(factory);2.
3.使用解析器解析request对象:List list=upload.parseRequest(request);

一个FileItem对象对应一个表单项。FileItem类有如下方法:
String getFieldName():获取表单项的name的属性值。
String getName():获取文件字段的文件名。如果是普通字段,则返回null
String getString():获取字段的内容。如果是普通字段,则是它的value值;如果是文件字段,则是文件内容。
String getContentType():获取上传的文件类型,例如text/plain、image。如果是普通字段,则返回null。
long getSize():获取字段内容的大小,单位是字节。
boolean isFormField():判断是否是普通表单字段,若是,返回true,否则返回false。
InputStream getInputStream():获得文件内容的输入流。如果是普通字段,则返回value值的输入流。

d.使用fileUpload组件实现文件上传除了上面的那些方法之外还要注意的:
文件名中文乱码处理:servletFileUpload.setHeaderEncoding(“utf-8”) 或 request.setCharacterEncoding(“utf-8”);
表单普通字段中文乱码处理:new String(str.getBytes(“iso-8859-1”,“utf-8”));
设置内存缓冲区的大小,默认为10KB:diskFileItemFactory.setSizeThreshold(10241024);
指定临时文件目录,如果单个文件的大小超过内存缓冲区,该文件将会临时缓存在此目录下:diskFileItemFactory.setRepository(file);
设置单个文件大小限制,如果有某个文件超过此大小,将抛出FileUploadBase.FileSizeLimitExceededException:servletFileUpload.setFileSizeMax(1024
102410);
设置所有文件,也就是请求大小限制,如果文件总和超过此大小,将抛出FileUploadBase.SizeLimitExceededException:servletFileUpload.setSizeMax(1024
1024*20);
利用UUID生成伪随机字符串作为文件名避免重复:UUID.randomUUID().toString();
将文件写到硬盘上。写完之后,系统会自动将放在临时文件目录的该文件删除:fileItem.write(new File(path,fileName));

应用实例:在jsp页面写一个表单,将该表单提交到servlet中实现文件上传操作

1.文件上传需要用到的jar包,导入以下两个jar包到目录WebContent下的WEB-INF的lib文件夹中,选中这两个jar包:右键build path—>点击add build path

	commons-fileupload.jar包
	commons-io.jar包

2.在目录WebContent下创建一个jsp页面

upload.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>
	<!-- 注意事项:1.method="post"  2.enctype="multipart/form-data"  3.input type="file"-->
	<form action="UploadServlet" enctype="multipart/form-data"
		method="post">
		用户名:<input type="text" name="username"> <br>
		密码:<input type="password"name="pwd"> <br>
		选择你需要上传的文件<input type="file" name="pic"> <br>
		<input	type="submit" value="上传">
	</form>

</body>
</html>

3.创建包com.xiaochen.servlet,在该包创建UploadServlet

UploadServlet.java

package com.xiaochen.servlet;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public UploadServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		DiskFileItemFactory factory=new DiskFileItemFactory();
        ServletFileUpload upload=new ServletFileUpload(factory);
 
        request.setCharacterEncoding("utf-8");
        //文件名中文乱码处理也可以如此写
//        upload.setHeaderEncoding("utf-8");
 
        //设置缓冲区大小与临时文件目录
        factory.setSizeThreshold(1024*1024*10);
        //我将临时的文件目录设置在d盘的test_upload文件夹
        File uploadTemp=new File("d:\\test_uploadtemp");
        uploadTemp.mkdirs();
        factory.setRepository(uploadTemp);
 
        //设置单个文件大小限制
        upload.setFileSizeMax(1024*1024*10);
        //设置所有文件总和大小限制
        upload.setSizeMax(1024*1024*30);
 
        try {
            List<FileItem> list=upload.parseRequest(request);
            System.out.println(list);
            for (FileItem fileItem:list){
                if (!fileItem.isFormField()&&fileItem.getName()!=null&&!"".equals(fileItem.getName())){
                    String filName=fileItem.getName();
                    //利用UUID生成伪随机字符串,作为文件名避免重复
                    String uuid= UUID.randomUUID().toString();
                    //获取文件后缀名
                    String suffix=filName.substring(filName.lastIndexOf("."));
 
                    //获取文件上传目录路径,在项目部署路径下的upload目录里。若想让浏览器不能直接访问到图片,可以放在WEB-INF下
                    //String uploadPath=request.getSession().getServletContext().getRealPath("/upload");
                    
                    //定义文件路径:指定上传的位置
                    String uploadPath="D:\\test_upload";
					
                    File file=new File(uploadPath);
                    file.mkdirs();
                    //写入文件到磁盘,该行执行完毕后,若有该临时文件,将会自动删除
                    fileItem.write(new File(uploadPath,uuid+suffix));
                    
                    //上传成功提示
                    response.setCharacterEncoding("GBK");
                    response.getWriter().println("上传成功!!!");
                    
                }
            }
        }  catch (Exception e) {
            e.printStackTrace();
        }

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
/*		
		//提前设置好编码格式,避免乱码
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=UTF-8");
		
		//文件上传
		boolean isMutipart=ServletFileUpload.isMultipartContent(request);
		//判断前台form是否有mutipart属性
		if(isMutipart) {
			try {
				FileItemFactory factory=new DiskFileItemFactory();
				ServletFileUpload upload=new ServletFileUpload(factory);
				//通过parseRequest解析form中的所有请求字段,并保存到items集合中
				List<FileItem> items=upload.parseRequest(request);
				//遍历items中的数据(u_id,u_name,u_file)
				Iterator<FileItem> iter=items.iterator();
				while(iter.hasNext()) {
					FileItem item=iter.next();
					//获取表单字段的name值
					String itemName=item.getFieldName();
					int u_id=-1;
					String u_name=null;
					//request.getParameter() ----->  iter.getString()
					
					//判断前台字段是普通form表单字段(u_id,u_name),还是文件字段
					if(item.isFormField()) {
						//根据name属性判断item是u_id还是u_name
						if(itemName.equals("u_id")) {
							u_id=Integer.parseInt(item.getString("UTF-8"));
						}else if(itemName.equals("u_name")) {
							u_name=item.getString("UTF-8");
						}else {
							System.out.println("其他字段。。。");
						}
					}
					//是文件字段
					else {
						//获取文件的name值
						String fileName=item.getName();
						//获取文件内容并上传
						//定义文件路径:指定上传的位置
						String path="D:\\test_upload";
						File file=new File(path,fileName);
						//文件上传
						item.write(file);
						System.out.println(fileName+"上传成功!!!");
						
					}
				}
				
				
			} catch (FileUploadException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		}
*/
	}
}

运行结果图
上传前
在这里插入图片描述
在这里插入图片描述

上传后
在这里插入图片描述
在这里插入图片描述
转载自:java_web文件上传

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值