servlet实现文件上传

该博客介绍了如何使用Servlet处理文件上传。通过示例代码展示了如何配置上传参数,处理上传的文件,以及保存到本地文件系统。同时,文章还强调了ServletFileUpload类在判断和处理表单字段以及文件内容中的作用。
摘要由CSDN通过智能技术生成

servlet实现文件上传

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body >
    <div style="text-align:center">
    <form action="uploadServlet">
        姓名:<input type="text" name="name"/><br>
        <input type="file" name="uploadFile" id=""/><br>
        <button type="submit">提交</button>

    </form>
</div>
</body>
</html>

uploadServlet
package com.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.security.auth.x500.X500Principal;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.bean.ipLocation;
import com.db.Idb;
import com.db.Impl.dbImpl;
import com.entity.student;


@WebServlet("/uploadServlet")
public class addStudentServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	// 上传文件存储目录
    private static final String UPLOAD_DIRECTORY = "upload";
 
    // 上传配置
    private static final int MEMORY_THRESHOLD   = 1024 * 1024 * 3;  // 3MB
    private static final int MAX_FILE_SIZE      = 1024 * 1024 * 40; // 40MB
    private static final int MAX_REQUEST_SIZE   = 1024 * 1024 * 50; // 50MB
    //表单字段
    String name ;



	String relativePath;
    public addStudentServlet() {
        super();
    }

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//文件上传
		// 检测是否为多媒体上传
	    if (!ServletFileUpload.isMultipartContent(request)) {
	        // 如果不是则停止
	        PrintWriter writer = response.getWriter();
	        writer.println("Error: 表单必须包含 enctype=multipart/form-data");
	        writer.flush();
	        return;
	    }

	    // 配置上传参数
	    DiskFileItemFactory factory = new DiskFileItemFactory();
	    // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
	    factory.setSizeThreshold(MEMORY_THRESHOLD);
	    // 设置临时存储目录
	    factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

	    ServletFileUpload upload = new ServletFileUpload(factory);
	     
	    // 设置最大文件上传值
	    upload.setFileSizeMax(MAX_FILE_SIZE);
	     
	    // 设置最大请求值 (包含文件和表单数据)
	    upload.setSizeMax(MAX_REQUEST_SIZE);

	    // 中文处理
	    upload.setHeaderEncoding("UTF-8"); 

	    // 构造临时路径来存储上传的文件
	    // 这个路径相对当前应用的目录
	    String uploadPath =request.getServletContext().getRealPath(".") +  File.separator + UPLOAD_DIRECTORY;
	   
	    
	    relativePath = File.separator + UPLOAD_DIRECTORY;
//	     System.out.println(relativePath);
	    // 如果目录不存在则创建
	    File uploadDir = new File(uploadPath);
	    if (!uploadDir.exists()) {
	        uploadDir.mkdir();
	    }

	    try {
	        // 解析请求的内容提取文件数据
	        @SuppressWarnings("unchecked")
	        List<FileItem> formItems = upload.parseRequest(request);
	        
	        if (formItems != null && formItems.size() > 0) {
	        	
	            // 迭代表单数据
	            for (FileItem item : formItems) {
	            	System.out.println(item.isFormField());
	                // 处理不在表单中的字段
	                if (!item.isFormField()) {
	                    String fileName = new File(item.getName()).getName();
	                    String filePath = uploadPath + File.separator + fileName;
	                    File storeFile = new File(filePath);
	                    relativePath = relativePath+ File.separator + fileName;
	                    System.out.println("."+relativePath.replace("\\", "/"));
	                    // 在控制台输出文件的上传路径
	                    System.out.println(filePath);
	                    picPath = filePath;
	                    // 保存文件到硬盘
	                    item.write(storeFile);
	                    request.setAttribute("message",
	                        "文件上传成功!");
	                    String name = item.getFieldName();
	                    System.out.println(name);
	                }else  {
			// 处理表单中的字段
	                	String name = item.getFieldName();
	                    System.out.println(name);
	                    System.out.println("------------------------");
	                    String cString = "sclass";
//	                    sclass =item.getString("utf-8");
//                		System.out.println(sclass);
	                	if(name.equals("name")) {
	                		name=item.getString("utf-8");
	                		System.out.println(sclass);
	                	}
					}
	                
	                
	            }

		    	request.getRequestDispatcher("./index.jsp").forward(request, response);
		    	}else {
		    		 boolean result = db.addStudent(student);
		    		 
		    		 if (result) {
		    			 request.setAttribute("result", "1");
		    			request.getRequestDispatcher("./index.jsp").forward(request, response);
		    		
		    		 }else {
		    			request.setAttribute("result", "2");
		    		}
		    		 
		    	}
	            
	        }
	        
	    } catch (Exception ex) {
	        request.setAttribute("message",
	                "错误信息: " + ex.getMessage());
	    }
	
	 
	
	
	
	
	}

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

}

  1. isFormField方法isFormField方法用于判断FileItem类对象封装的数据是否属于一个普通表单字段,还是属于一个文件表单字段,如果是普通表单字段则返回true,否则返回false。
  2. getFileName()方法 如果是文件获取文件名,如果为普通字段获取字段的name属性值
  3. getName() 获取文件上传字段中的文件名
  4. getString() 讲数据内容以字符串形式返回。
  5. write() write方法用于将FileItem对象中保存的主体内容保存到某个指定的文件中。如果FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后,临时文件有可能会被清除。该方法也可将普通表单字段内容写入到一个文件中,但它主要用途是将上传的文件内容保存在本地文件系统中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值