Web后端servlet—使用servlet的Part接口实现单文件多文件上传、以及日期格式转换为sql日期格式的实现

Web后端servlet—使用servlet的Part接口实现单文件多文件上传、以及日期格式转换为sql日期格式的实现,第1张

JDBC工具类JdbcFileDateUtil上传文件和日期格式转换,包含单文件多文件上传最新最简单简便的办法 本文档介绍了文件上传的处理方法,包括当前端form表单的编码类型为enctype="multipart/form-data"时如何处理?以及老办法获取上传文件的名字,新办法自己一个函数获取上传文件的名字。最后讲解了上传一个文件和上传多个文件的区别和代码。
一、文件上传注意事项

当前端的form表单包含有文件上传时,有以下知识点:

1.form表单中的数据编码类型要写 enctype="multipart/form-data" 才能上传文件,该编码类型将会以二进制的形式上传数据。

2.问题来了,当编码类型为multipart/form-data时,后台通过  request.getParameter(NAME)将无法获取到文本类型的值。

二、实现文件上传并解决后台无法获取值的问题 核心:servlet3.0的Part接口

通过@MultipartConfig注解和HttpServletRequest的两个新方法getPart()和getParts()相互辅助来达到当前端form表单使用 enctype="multipart/form-data"上传文件和文本两种数据时的功能。

1.使用@MultipartConfig注解后不仅可以使后端的request.getParameter(NAME)能够获取到文本数据的值,还可以使用servlet3新增的part接口,该接口中有两个新方法可以直接获取文件数据并写入保存路径中。所以说这样是非常的方便简洁。

2.HttpServletRequest的两个新方法getPart()和getParts()是为了接收前端form表单传过来的文件数据,getPart()只能接收一个文件,getParts()可以接收多个文件。

三、@MultipartConfig注解有四个属性值来规定文件的一些属性。

fileSizeThreshold:整数值设置,默认值为0,若上传文件的大小超过了这个值,就会先写入缓存文件。

location:上传文件的保存路径。

maxFileSize:限制文件上传大小。默认值为-1L,表示不限制大小。

maxRequestSize:限制multipart/form-data请求格式,默认值为-1L,表示不限制个数。

重点四、文件上传老办法整体源代码
package com.jdbc.utils;
import java.io.IOException;
import java.sql.Date;
import java.sql.SQLException;
/* 表单的日期数据转换为sql日期格式 dataTrans(String sr0)  
	1、将表单的字符串格式的日期转换为java的日期格式
	2、将java的日期格式转换为sql的日期格式
	
	保存上传的图片到指定存储路径savaFile()
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;

import javax.imageio.IIOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import com.sun.org.apache.bcel.internal.generic.NEW;

public class JdbcFileDateUtil {

//	servlet测试代码:  java.sql.Date sr0 = JdbcFileDateUtil1.dataTrans(born0);//此时经过转换时间是sql里面的日期类型
	public static java.sql.Date dataTrans(String sr0) {
		SimpleDateFormat  sdf = new SimpleDateFormat("yyyy-MM-dd");//根据参数指定的字符串模式来构造对象。实现日期类型和字符串之间的相关转换
		java.util.Date sr1 =new java.util.Date();
		try {
			sr1=sdf.parse(sr0);//用于将String类型转换成Date类型
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return new java.sql.Date((sr1.getTime()));//getTime获取当前对象距离1970年1月1日0时0分0秒的毫秒数
	}
	
//	将表单上传选择的文件保存到服务器指定的上传文件路径
//	适用于不管有没有上传文件的两种情况
	public static String saveFile(String FileInputName,HttpServletRequest request) throws ServletException,SQLException, IOException {
		String savaPath = "D:\\Web后端开发技术\\uploadFile";
		Part part =request.getPart(FileInputName);//MyFile值为html中input标签的name值
		String header=part.getHeader("Content-Disposition");
		int start=header.lastIndexOf("=");
		filename=header.substring(start+1);
		if (filename.length()>2) {
			filename=filename.substring(filename.lastIndexOf('\\')+1);
			filename=filename.substring(0,filename.length()-1);//去掉最后的一个引号 ”
			String temp= new SimpleDateFormat("yyyyMMddHHmmssSSSS").format(new java.util.Date().getTime());//时间戳,添加到文件名前,用来防止两个文件名重复
			filename=temp+"."+filename;
			part.write(savaPath+"\\"+filename);//上传文件写入要保存的路径
		}
		return filename;	
	}
}
优化代码: 把文件名的处理过程单独拿出来模块化为一个方法getFileName(Part part)。 (一)上传一个文件的方法:使用getPart(name)
public static String saveFile(String FileInputName,HttpServletRequest request) throws ServletException,SQLException, IOException {
		String savaPath = "D:\\Web后端开发技术\\uploadFile";
	    Part part = request.getPart(FileInputName);
        String filename = getFileName(part);
        part.write(savaPath+"\\"+filename);write()方法。可以直接将上传文件写入磁盘中
		return filename;	 //要返回,用于存放到数据库中
	}
	
public static String getFileName(Part part) {
		String header = part.getHeader("Content-Disposition");
        int start=header.lastIndexOf("=");
        filename=header.substring(start+1);
        if (filename.length()>2) {
	            filename=filename.substring(filename.lastIndexOf('\\')+1);
			    filename=filename.substring(0,filename.length()-1);//去掉最后的一个引号 ”
			    String temp= new SimpleDateFormat("yyyyMMddHHmmssSSSS").format(new java.util.Date().getTime());//时间戳,添加到文件名前,用来防止两个文件名重复
		    	filename=temp+"."+filename;
                return filename;
		}
		 return filename;//如果上传文件为空,则文件名为空
}
(二)上传多个文件的方法:使用getParts()
public static String saveFiles(String FileInputName,HttpServletRequest request) throws ServletException,SQLException, IOException {
		String savaPath = "D:\\Web后端开发技术\\uploadFile";
	  	// 从前端form中获取所有文件数据并存放于一个list中
		List parts = (List) request.getParts();

//循环遍历文件,每一次循环就获得一个文件的名字并把该文件数据写入磁盘
// 获取当前part指向的input标签的name,只有name是以MyFile的值开头的才能进入获取文件名 *** 作,
// 否则跳到下一个part,这里的part.getName().startsWith(MyFile)是重点理解要结合前端input的name值理解
//  startsWith()的参数就是上传文件夹对应的input标签的name名字

        for(Part part : parts) {
//photo是文件的input标签name属性,saveFiles第一个参数就是name属性
         if (part.getName().startsWith("photo")) {
        	  String filename = getFileName(part);
        	  if (filename.length()>2) {   		
	      			String temp= new SimpleDateFormat("yyyyMMddHHmmssSSSS").format(new java.util.Date().getTime());
	      			filename=temp+"."+filename;
	      			part.write(savaPath+"\\"+filename);//write()方法。可以直接将上传文件写入磁盘中
        	  	}
               filenames+=filename+"/";//多个文件时,该filenames保存所有的文件名并存入数据库中
			}
        }
		return filenames;	 //要返回,用于存放到数据库中
	}

重点讲解多文件上传过程:

图1 前端选择的文件名字和input标签的name名字,有三个name=photo的,有一个name=pic在中间的。

 

图2 后台处理文件的过程中打印的head信息和文件名,发现只有name=photo的文件被接收了。



图3 设计有三个name以photo为开头的文件上传控件

 

 图4 发现仍然是只有name是photo开头的文件都可以被接收数据保存到磁盘。

通过这个案例我想重点说的是,只有后端的  part.getName().startsWith("photo") 满足是input标签的 name名字的part才会接受数据。

重重重点点点五、单文件多文件上传最新办法

tomcat8使用servlet3.0上传文件,有一个方法 getSubmittedFileName() 直接获取文件名,不需要去截取那么麻烦了。

/* 
 	一、表单的日期数据转换为sql日期格式 dataTrans(String sr0)  
		1、将表单的字符串格式的日期转换为java的日期格式
		2、将java的日期格式转换为sql的日期格式
	
	二、保存上传的图片到指定存储路径savaFile(),这里是单个文件上传
*/
package com.jdbc.utils;
import java.io.IOException;
import java.sql.Date;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.imageio.IIOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import com.sun.org.apache.bcel.internal.generic.NEW;

public class JdbcFileDateUtil {
	
//日期格式转换工具
	public static java.sql.Date dataTrans(String sr0) {
		
		//根据参数指定的字符串模式来构造对象。实现日期类型和字符串之间的相关转换
		SimpleDateFormat  sdf = new SimpleDateFormat("yyyy-MM-dd");
		java.util.Date sr1 =new java.util.Date();
		try {
			sr1=sdf.parse(sr0);//用于将String类型转换成Date类型
		} catch (ParseException e) {
			e.printStackTrace();
		}
		//getTime获取当前对象距离1970年1月1日0时0分0秒的毫秒数
		return new java.sql.Date((sr1.getTime()));
	}
	
//	将表单上传选择的文件保存到服务器指定的上传文件路径
//	适用于不管有没有上传文件的两种情况,没有上传文件就为空。
	//1.单个文件上传
	public static String saveFile(String FileInputName,HttpServletRequest request) throws ServletException,SQLException, IOException {
		String savaPath = "D:\\【1】学校专业课\\大三下\\Web后端开发技术\\uploadFile";
		Part part =request.getPart(FileInputName);
		//tomcat8使用servlet3.0上传文件,有一个方法getSubmittedFileName直接获取文件名,不需要去截取那么麻烦
		String filename = part.getSubmittedFileName();
		if (filename.length()>2) {
			//给文件名添加一个时间戳,防止重名文件。
			String temp= new SimpleDateFormat("yyyyMMddHHmmssSSSS").format(new java.util.Date().getTime());
			filename=temp+"."+filename;
			part.write(savaPath+"\\"+filename);//write()方法。可以直接将上传文件写入磁盘中
		}
		System.out.println(filename);
		return filename;	
	}
	
	
	//2.多个文件上传
	public static String saveFiles(String FileInputName,HttpServletRequest request) throws ServletException,SQLException, IOException {
		String savaPath = "D:\\【1】学校专业课\\大三下\\Web后端开发技术\\uploadFile";
// 从前端form中获取所有文件数据并存放于一个list中
		List parts = (List) request.getParts();
		String filenames ="";
//循环遍历文件,每一次循环就获得一个文件的名字并把该文件数据写入磁盘
        for(Part part : parts) {
// 获取当前part指向的input标签的name,只有name是以MyFile的值开头的才能进入获取文件名 *** 作,
// 否则跳到下一个part,这里的part.getName().startsWith(MyFile)是重点理解要结合前端input的name值理解
//        	startsWith()的参数就是上传文件夹对应的input标签的name名字
        if (part.getName().startsWith(FileInputName)) {
        	  String filename = part.getSubmittedFileName();//直接获取当前part指向的文件名
        	  if (filename.length()>2) {   		
	      			String temp= new SimpleDateFormat("yyyyMMddHHmmssSSSS").format(new java.util.Date().getTime());
	      			filename=temp+"."+filename;
	      			part.write(savaPath+"\\"+filename);//write()方法。可以直接将上传文件写入磁盘中
        	  	}
               filenames+=filename+"/";//多个文件时,该filenames保存所有的文件名并存入数据库中
			}
        }
		return filenames;	 //要返回,用于存放到数据库中
	}

}


还有一个文件上传方法,不限文件数量,不限文件在form表单中的顺序:

https://mp.csdn.net/mp_blog/creation/editor/124302991https://mp.csdn.net/mp_blog/creation/editor/124302991

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/721870.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存