文件上传(servlet)

主界面:

<!--
    一、上传文件时,form表单的method属性必须设置为post,不能是get
    二、上传文件时,需要在表单属性中添加enctype属性,该属性用于设置表单提交数据的编码方式,
        由于文件传至服务器时与一般文本类型的编码方式不同,需要设置为multipart/form-data。
    PS:enctype属性共有三个值,如下
        1、application/x-www-form-urlencoded,默认值,该属性值主要用于处理少量文本数据的传递,处理二进制数据、非ASCII编码文本时,效率低;
        2、multipart/form-data,上传二进制数据,只有使用了multipart/form-data属性值才能完整地传递文件数据;
        3、text/plain,主要用于向服务器传递大量文本数据,如电子邮件、发布长篇新闻等。
-->
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
    我叫:<input type="text" name="userName">
    密码:<input type="password" name="pwd">
    <!--<input type="file" name="myFile" multiple>,加上multiple属性,可以一次上传多个文件-->
    选择文件:<input type="file" name="myFile" multiple>
    <input type="submit" value="上传">
</form>

servlet类:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUploadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	List<String> pList = new ArrayList<String>();
    	try {
            //1 工厂
            FileItemFactory fileItemFactory = new DiskFileItemFactory();
            //2 核心类
            ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
            //设置字符集编码
            servletFileUpload.setHeaderEncoding("UTF-8");
            // 设置一个完整请求的最大限制
            servletFileUpload.setSizeMax(1024*1024 * 30); 
            //3 解析request  ,List存放 FileItem (表单元素的封装对象,一个<input>对应一个对象)
            List<FileItem> list = servletFileUpload.parseRequest(request);
            //4 遍历集合获得数据
            for (FileItem fileItem : list) {
                if(fileItem.isFormField()){
                    // 5 是否为表单字段(普通表单元素)
                	String value = fileItem.getString("UTF-8");
                	pList.add(value);//将非文件的其他参数放到一个list中,后面可以顺序的去取到
                	continue;
                } else {
                    //6 上传字段(上传表单元素)
                    //6.1.表单字段名称  fileItem.getFieldName();
                    //6.2.上传文件名
                    String fileName = fileItem.getName();
                    
                    // * 兼容浏览器, IE : C:\Users\xxx\Desktop\abc.txt  ; 其他浏览器 : abc.txt
                    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
                    System.out.println(fileName);    //上传的文件名会中文乱码,
                    //切割扩展名(PNG)
                    int dot = fileName.lastIndexOf('.'); 
                    String png=fileName.substring(dot+1);
                    System.out.println(png);
                    //允许上传文件
                    List<String> fileType = Arrays.asList("gif", "png", "jpg");
                    if (!fileType.contains(png)) {  // 判断文件类型是否在允许范围内
                    	System.out.println("上传失败,文件类型只能是gif、png、jpg");
                    } 
                    //6.3.上传内容
                    InputStream is = fileItem.getInputStream();    //获得输入流,
                    String parentDir = this.getServletContext().getRealPath("/smartUpload");
                    File file = new File(parentDir,fileName);
                    if(! file.getParentFile().exists()){  //父目录不存在
                        file.getParentFile().mkdirs();        //mkdirs():创建文件夹,如果上级目录没有的话,也一并创建出来。
                    }
                    FileOutputStream out = new FileOutputStream(file);    
                    byte[] buf = new byte[1024];
                    int len = -1;
                    while( (len = is.read(buf)) != -1){
                        out.write(buf, 0, len);
                    }
                    //关闭
                    out.close();
                    is.close();
                    
                }
            }
            String username=pList.get(0);
            String pwd=pList.get(1);
            System.out.println(username+"\t"+pwd);
            request.setAttribute("name", username);
            request.setAttribute("pwd", pwd);
            request.getRequestDispatcher("showUser.jsp").forward(request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    	
    }

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值