JavaWeb笔记25-文件上传及注意问题

文件上传
a、引入两个jar包
apache:commons-fileupload组件
commons-fileupload.jar依赖于commons-io.jar组件

b、代码**
显示层前台:jsp**

<input type="file" name="spicture">

注意:
1、表单提交方式必须为post
2、在表单中必须增加一个属性:
enctype=“multipart/form-data”

示例代码:

<%@ 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="UploadServlet" method="post" enctype="multipart/form-data">
		学号:<input type="text" name="sno"><br/>
		姓名:<input type="text" name="sname"><br/>
		上传照片:<input type="file" name="Spicture"><br/>
		<input type="submit" value="提交">
	</form>
</body>
</html>

显示层后台:servlet
注意上传的目录upload
1、如果修改代码,该目录在tomcat重新启动时会被删除
2、如果不修改代码,则该目录在tomcat重启时不会被删除
原因:Tomcat在运行时只需要由java程序编译成的class文件,在tomcat重启时,class文件就会被重新打包生成一份,upload目录同时也被重新生成一份,旧的upload就会被取代
对应方法
1、构建虚拟目录
2、直接更换上传目录,到非tomcat目录

示例代码:

package my.student.servlet;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


public class UploadServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		//上传
		//isMultipartContent用于检查从jsp上传的表单是否有一个multipart
		boolean isMultipart=ServletFileUpload.isMultipartContent(request);  //返回值布尔值
		if(isMultipart) {  //进行上传操作
			//DiskFileItemFactory是FileItemFactory的实现类,FIleTtemFactory为接口类
			FileItemFactory factory=new DiskFileItemFactory();
			//上传用ServletFileUpload对象,ServletFileUpload对象的使用需要一个FielItemFactory对象
			ServletFileUpload upload=new ServletFileUpload(factory);
			//通过parseRequest解析表单form中所有请求字段,并保存到items集合中(即前台传递的sno sname spicture就保存在items中)
			List<FileItem> items=null;
			try {
				items=upload.parseRequest(request);
			} catch (FileUploadException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//遍历items中的数据获取从表单form中获取的字段
			Iterator<FileItem> iter=items.iterator();
			while(iter.hasNext()) {  //类似于rs
				//用FileItem获取下一个字段的值
				FileItem item=iter.next();
				String itemName=item.getFieldName();
				String sno=null;
				String sname=null;
				//因为从表单中传过来的数据无法区分次序,所以需要用字段名name属性来区分
				//除此之外,还需要判断前台字段是普通表单字段还是文件字段
				if(item.isFormField()) { //如果是普通表单字段,则需要用字段名属性来区分
					if(itemName.equals("sno")) {  //说明遍历到sno字段
						sno=item.getString("UTF-8");  //获取sno的值
					}else if(itemName.equals("sname")){//说明是sname字段
						sname=item.getString("UTF-8");  //获取sname的值
					}
				}else {   //如果不是普通表单字段,说明是文件字段
					//文件上传处理
				   	//1、文件名  2、文件内容
					//getFiledName()是获取普通表单字段的Name值(sno sname spicture)
					//getName()是获取文件名
					String fileName=item.getName();    //获取文件名
					//获取文件内容上传
					//定义文件路径:指定上传位置(服务器路径)
					//String path="D:\\java程序\\UpAndDown\\WebContent";  //地址和程序耦合性过强,不好
					//获取服务器路径,需要用到application方法
					String path=request.getSession().getServletContext().getRealPath("upload");
					System.out.println(path);
					File file=new File(path,fileName);  //文件名保持一致
					try {
						item.write(file);
						System.out.println(fileName+"上传成功!");
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						System.out.print("上传失败!");
					} //上传
				}
			}
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

控制文件上传类型和大小
文件类型:
通过对文件名小数点"."后字段的控制来控制上传文件类型
示例代码:

String fileName=item.getName();
					//判断文件类型
					String ext=fileName.substring(fileName.indexOf(".")+1);
					if(!ext.equals("png")||!ext.equals("txt")) {
						System.out.println("文件只能是png/txt");
						return;  //终止
					}

文件大小示例代码:

//控制上传单个文件的大小:注意一定要写在pareseRequest解析前
			//设置上传文件时用到的临时文件的大小
			//客户端文件上传到服务端并不是一步到位,而是先把文件传入缓冲区
			//需注意,上传文件大小用ServletFileUpload设置
			//缓冲区文件大小用FileItemFactory设置
			factory.setSizeThreshold(10240);  //临时文件10KB
			//设置临时文件目录
			factory.setRepository(new File("D:\\java程序\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\UAD\\uploadwemp")); 
			upload.setSizeMax(20480); //单个文件20KB 单位:字节B
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值