jsp——SmartUpload上传下载


SmartUpload 简介


SmartUpload组件是www.jspsmart.com网站开发的一套上传组件,它使用简单,方便。有以下几个特点:
使用简单。在JSP中仅仅书写三五行java代码就可以搞定文件的上传或下载。
能全程控制上传。利用SmartUpload组件提供的对象及其操作方法,
可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取
下载灵活。仅写两行代码,就能把Web服务器变成文件服务器。
不管文件在Web服务器的目录下或在其他任何目录下,都可以使用SmartUpload进行下载。


SmartUpload本身是一个系统提供的jar包,用户直接将此包复制到TOMCAT_HOME\lib目录下即可。
SmartUpload组件提供方网站已经关闭。
不过,由于SmartUpload在非框架的开发中较为好用,所以直到今天还有开发者继续使用。

上传单个文件


要进行上传,则必须使用HTML中提供的file控件,而且也必须使用enctype属性进行封装。

对于上传文件的FORM表单,有两个要求:1、METHOD应用POST,即METHOD=“POST”。2、增加属性:ENCTYPE="multipart/form-data"

<body>
    <form action=“SmartUpload01.jsp” method=“post” enctype=“multipart/form-data”>               //对表单进行封装 
    
    	 上传的图片:<input type="file" name="pic">
    	 <input type="submit" value="上传">
    </form>
  </body> 

完成上传的步骤:

1.实例化SmartUpload对象;
2.初始化上传的操作;
3.准备上传;
4.保存文件。
<%
SmartUpload smart = new SmartUpload();    //实例化SmartUpLoad上传组件
smart.initialize(pageContext);            //初始化上传操作
smart.upload();                                  //上传准备
smart.save("upload");                     //将上传文件保存到upload文件夹中 
%>

举例:

upload_1.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>

	<form action="doUpload_1.jsp" method="post" enctype="multipart/form-data"> 
		上传的图片:<input type="file" name="pic"><br>
		<input type="submit" value="上传">
	</form>

</body>
</html>

doUpload_1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
 <%@ page import="com.jspsmart.upload.*" %>  <!-- 将jar包导进来 -->
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	SmartUpload smart = new SmartUpload();
	smart.initialize(pageContext);  //初始化上传
	smart.upload();  //上传准备
	smart.save("upload");//将文件保存到服务器相应目录下"/Library/apache-tomcat-8.5.64/webapps/Servlet_Higher/upload"
	out.print("文件上传成功");
%>

</body>
</html>

注意:
<%@ page import=“com.jspsmart.upload.*” %> 一定要记得导入jar包所在的位置

在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

此时,文件已经上传到了/Library/apache-tomcat-8.5.64/webapps/Servlet_Higher/upload"路径下,然后在此路径下的upload文件夹下查看是否文件已经上传到这里面
在这里插入图片描述
我们可以发现,此时我已经将文件成功的上传到了upload文件夹中,可能有些人发现自己运行成功了,但是图片并没有成功的上传,这是为什么?
首先:对于Tomcat的路径配置问题,双击点开Servers下面的Tomcat,我们可以查看配置路径。

在这里插入图片描述
对于上面的路径,需要是你安装的Tomcat所在的路径下的webapps文件夹下
其次,如果你仍然没有看到图片的上传,那有可能你还没有upload文件夹,你需要手动建立一个文件夹,而且必须在eclipse下项目中创建一个upload文件夹

在这里插入图片描述
这样,所有的问题就可以解决了。
在这里插入图片描述

当然上面的文件可以使用Servlet文件进行代替,如下:
upload_1.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>

	<form action="uploadServlet1" method="post" enctype="multipart/form-data">
		上传的图片:<input type="file" name="pic"><br>
		<input type="submit" value="上传">
	</form>

</body>
</html>

UploadServlet_1.java

package cn.servlet;

import java.io.IOException;
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 com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;

/**
 * Servlet implementation class UploadServlet_1
 */
@WebServlet("/up_load/uploadServlet1")
public class UploadServlet_1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UploadServlet_1() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		SmartUpload smart = new SmartUpload();
		smart.initialize(this.getServletConfig(), request, response);//初始化上传
		try {
			smart.upload();
			smart.save("upload");//保存文件到服务器相应文件夹
		} catch (ServletException | IOException | SmartUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}//准备上传
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

上面的代码也可以将图片上传到上传到upload文件夹中
注意把jar包导入!!!➡️import com.jspsmart.upload.*;


混合表单


表单一旦封装之后,就无法使用request.getParameter()接收参数了,
因为表单被封装了,所有的数据不再是文本数据了,而是二进制的byte流了,
这时必须使用SmartUpload中提供的方法支持。
smart.getRequest().getParameter("uname");

upload_2.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>


<form action="doUpload_2.jsp" method="post" enctype="multipart/form-data" >
		姓名:<input type="text" name="username"><br>
		图片:<input type="file" name="pic"><br> 
		<input type="submit" value="提交">
		<input type="reset" value="重置">
</form>


</body>
</html>

doUpload_2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
 <%@ page import="com.jspsmart.upload.*" %>  <!-- 将jar包导进来 -->
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	SmartUpload smart = new SmartUpload();
	smart.initialize(pageContext);  //初始化上传
	smart.upload();  //上传准备
	String uname = smart.getRequest().getParameter("username");
	//out.print("文件上传成功");
	//out.print("姓名:"+uname);
	uname = uname + "." + smart.getFiles().getFile(0).getFileExt();//➕的最后面的是用来获取多个文件中的第一个文件的扩展名
	String fileName = this.getServletContext().getRealPath("/")+"upload/"+uname;
	smart.getFiles().getFile(0).saveAs(fileName);//按照文件名上传
%>
路径:<%=fileName %>
<img src="../upload/<%=uname%>" width="200px">

</body>
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


为上传文件自动命名


如果多个用户上传的文件的名称一样,则肯定会发生覆盖的情况。
为了解决这种问题,可以采用为上传文件自动命名的方式,为防止重名,自动命名可采用如下的格式:
IP地址+时间戳+三位随机数
sessionId+时间戳

upload_3.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>

<form action="doUpload_3.jsp" method="post" enctype="multipart/form-data">
		照片1:<input type="file" name="pic1"><br>
		照片2:<input type="file" name="pic2"><br>
		照片3:<input type="file" name="pic3"><br>
		<input type="submit" value="上传">
		<input type="reset" value="重置">
</form>

</body>
</html>

doUpload_3.jsp

<%@page import="cn.upload.utils.IPTimeStamp"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
     <%@ page import="com.jspsmart.upload.*" %>  <!-- 将jar包导进来 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
		SmartUpload smart = new SmartUpload();
		smart.initialize(pageContext);  //初始化上传
		smart.upload();  //上传准备
		//首先要获取IP地址
		IPTimeStamp its = new IPTimeStamp(request.getRemoteAddr());//获取客户端(上传端)IP地址
		System.out.println("IP地址:"+request.getRemoteAddr());
		for(int x =0 ; x<smart.getFiles().getCount();x++){
			String ext = smart.getFiles().getFile(x).getFileExt(); //获取上传文件的扩展名
			String filName = its.getIPTimeRandom()+"."+ext;	//生成上传文件的完整的用户名
			String pathName = this.getServletContext().getRealPath("/")/*获取项目的根目录*/+"upload"+java.io.File.separator+filName;
			smart.getFiles().getFile(x).saveAs(pathName);
		}
		
		out.print("上传文件成功!");
		
%>

</body>
</html>

工具类:IPTimeStamp.java

package cn.upload.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

public class IPTimeStamp {
		
	private SimpleDateFormat sdf = null;//时间戳
	private String ip = null;//ip地址
	
	public IPTimeStamp() {
		super();
	}

	public IPTimeStamp(String ip) {
		super();
		this.ip = ip;
	}
	
	public String getTimeStamp() {//获取时间戳
		this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		return this.sdf.format(new Date());
	}
	
	public String addZero(String str , int len ) {//把IP地址分割几部分 再填充
		StringBuffer s = new StringBuffer();
		s.append(str);
		while(s.length()<len) {
			s.insert(0, "0");
		}
		return s.toString();
	}
	
	public String getIPTimeRandom() {
		StringBuffer buf = new StringBuffer();
		if(this.ip!=null) {
			String s[] = this.ip.split("\\:");
			for(int i = 0 ; i < s.length ; i++ ) {
				buf.append(this.addZero(s[i], 3));
			}
		}
		buf.append(this.getTimeStamp());
		Random r = new Random();
		for(int i = 0 ; i < 3 ; i++ ) {
			buf.append(r.nextInt(10));//生成一个小于10的随机数
		}
		return buf.toString();
	}
	
}

注意:
分割IP地址的方法,用什么来分割IP地址呢?
首先,我们需要获取IP地址,将其输出
System.out.println(“IP地址:”+request.getRemoteAddr());

在这里插入图片描述
我们发现IP地址使用的是“:”进行分开的,所以分割IP地址的时候要使用“:”

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


SmartUpload主要类和方法


File类:

这个类包装了一个上传文件的所有信息。通过它,可以得到上传文件的文件名、文件大小、扩展名、文件数据等信息 。

public void saveAs( java.lang.String destFilePathName)
作用:将文件换名另存。

public boolean isMissing() 
作用:这个方法用于判断用户是否选择了文件,也即对应的 表单项是否有值。选择了文件时,它返回 false 。未选文件时,它返回 true 。

public String getFieldName()
作用:取 HTML 表单 中对应于此上传文件的 表单 项的名字。 

public String getFileName() 
作用:取文件名(不含目录信息) 

 public String getFilePathName  
 作用:取文件全名(带目录)
 
 public int getSize()   
 作用:取文件长度(以字节计)

Files 类

这个类表示所有上传文件的集合,通过它可以得到上传文件的数目、大小等信息。

public int getCount()   作用:作用:取得上传文件的数目。 

public File getFile(int index) 
作用:取得指定位移处的文件对象 File (这是 com . JS Psmart.upload.File ,不是 JAVA .io.File ,注意区分)。其中, index 为指定位移,其值在 0 到 getCount()-1 之间。

 public long getSize()
作用:取得上传文件的总长度,可用于限制一次性上传的数据量大小

public String getFileName()  作用:取文件名(不含目录信息) 

public String getFilePathName  作用:取文件全名(带目录)

public int getSize()   作用:取文件长度(以字节计)

SmartUpload类

完成上传下载工作

public final void initialize( JAVA x. servlet . JS P.PageContext pageContext)
作用:执行上传下载的初始化工作,必须第一个执行。

 public void upload()  作用:上传文件数据
 
 public int save(String destPathName)  
作用:将全部上传文件保存到指定目录下,并返回保存的文件个数。

public int getSize()  作用:取上传文件数据的总长度原型

public Files getFiles()
作用:取全部上传文件,以 Files 对象形式返回,可以利用 Files 类的操作方法来获得上传文件的数目等信息。

public Request get Request ()   作用:取得 Request 对象。

public void setAllowedFilesList(String allowedFilesList) 
 作用:设定允许上传带有指定扩展名的文件,当上传过程中有文件名不允许时,组件将抛出 异常 。 	
 allowedFilesList 为允许上传的文件扩展名列表,各个扩展名之间以逗号分隔。
 如果想允许上传那些没有扩展名的文件,可以用两个逗号表示。
 
public void setDeniedFilesList(String deniedFilesList)   
作用:用于限制上传那些带有指定扩展名的文件。

public void setMaxFileSize(long maxFileSize)  
作用:设定每个文件允许上传的最大长度。 

public void setTotalMaxFileSize(long totalMaxFileSize)  
作用:设定允许上传的文件的总长度,用于限制一次性上传的数据量大小。

 //设定上传限制  
  //限制每个上传文件的最大长度;将最大设定为1024*1024*20  
  smartUpload.setMaxFileSize(1024*1024*10);     
  //限制总上传数据的长度  
  smartUpload.setTotalMaxFileSize(1024*1024*20);  
  //限制允许上传的文件类型、允许doc、txt、bat文件  
  smartUpload.setAllowedFilesList("doc,txt,bat");  
  //限制禁止上传的文件类型,禁止exe、jsp、和没有扩展名的文件  
  smartUpload.setDeniedFilesList("exe,jsp,,");  
  //上传文件  
  smartUpload.upload();  
  //将文件保存到指定的目录下  
  smartUpload.save(path); 

SmartUpload文件下载


download_1.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>

<form action="downloadServlet" method="post" enctype="multipart/form-data">
		下载文件:<a href="../down/1.jpg">电子商城使用说明书</a>
		<input type="submit" name="down" value="下载">
</form>


</body>
</html>

DownloadServlet.java

package cn.servlet;

import java.io.IOException;
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 com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;

/**
 * Servlet implementation class DownloadServlet
 */
@WebServlet("/up_load/downloadServlet")
public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DownloadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String url = request.getServletContext().getRealPath("/")+"down/1.jpg";
		SmartUpload smart = new SmartUpload();
		smart.initialize(getServletConfig(),request,response);
		smart.setContentDisposition(null);
		try {
			smart.downloadFile(url);
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SmartUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在这里插入图片描述
当点击下载后,谷歌浏览器就开始下载:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值