jsp——SmartUpload上传下载

article/2025/10/14 15:51:29

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 blocke.printStackTrace();}//准备上传}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SmartUploadException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

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


http://chatgpt.dhexx.cn/article/27dHZ5vO.shtml

相关文章

应用程序与驱动程序交互函数DeviceIoControl详解

这种通信方式&#xff0c;就是驱动程序和应用程序自定义一种IO控制码&#xff0c;然后调用DeviceIoControl函数&#xff0c;IO管理器会产生一个MajorFunction 为IRP_MJ_DEVICE_CONTROL&#xff08;DeviceIoControl函数会产生此IRP&#xff09;&#xff0c;MinorFunction 为自己…

QT(C++)DeviceIoControl()函数的相关使用

Microsoft官网中有这个函数的介绍&#xff0c;对&#xff0c;仅仅就是介绍&#xff0c;有时候官网的查询结果也就只能看看…… 在我写过的一个软件中&#xff0c;我曾经多次使用该函数获取相关结果&#xff0c;现将我的使用经验分享给大家&#xff01; DeviceIoControl()函数将…

应用程序与驱动程序通信 DeviceIoControl

本文为转载&#xff0c;参考链接地址 https://blog.csdn.net/li_wen01/article/details/80137566 https://www.cnblogs.com/lsh123/p/7354573.html DeviceIoControl 将控制代码直接发送到指定的设备驱动程序&#xff0c;使相应的设备执行相应的操作。 这种通信方式&#xff…

IO设备控制操作--DeviceIoControl

1.除了ReadFile和WirteFile以外&#xff0c;应用程序还可以通过另外一个API DeviceIoControl 操作设备。DeviceIoControl内部会使操作系统创建一个IRP_MJ_DEVICE_CONTROL类型的IRP&#xff0c;然后操作系统会将这个IRP转发到派遣函数中。 2.I/O控制码&#xff08;IOCTL&#xf…

DeviceIoControl获取硬盘信息

参考&#xff1a;DeviceIoControl 函数详细解析 BOOL WINAPI DeviceIoControl(_In_ HANDLE hDevice,_In_ DWORD dwIoControlCode,_In_opt_ LPVOID lpInBuffer,_In_ DWORD nInBufferSize,_Out_opt_ LPVOID lpOutBuf…

windows driver - DeviceIoControl 用法

原文地址&#xff1a;https://www.cnblogs.com/lsh123/p/7354573.html 之前写过一篇关于通过DeviceIoControl函数来使应用程序与驱动程序通信的博客&#xff0c;这次再通过这个完整的代码来简要疏通总结一下。 这种通信方式&#xff0c;就是驱动程序和应用程序自定义一种IO控制…

@ControllerAdvice 用法

ControllerAdvice 用法 顾名思义&#xff0c;ControllerAdvice就是Controller 的增强版。ControllerAdvice主要用来处理全局数据&#xff0c;一般搭配ExceptionHandler、ModelAttribute以及InitBinder使用。 全局异常处理 ControllerAdvice最常见的使用场景就是全局异常处理…

驱动开发:应用DeviceIoContro模板精讲

在笔者上一篇文章《驱动开发&#xff1a;应用DeviceIoContro开发模板》简单为大家介绍了如何使用DeviceIoContro模板快速创建一个驱动开发通信案例&#xff0c;但是该案例过于简单也无法独立加载运行&#xff0c;本章将继续延申这个知识点&#xff0c;通过封装一套标准通用模板…

驱动开发:应用DeviceIoContro开发模板

内核中执行代码后需要将结果动态显示给应用层的用户&#xff0c;DeviceIoControl 是直接发送控制代码到指定的设备驱动程序&#xff0c;使相应的移动设备以执行相应的操作的函数&#xff0c;如下代码是一个经典的驱动开发模板框架&#xff0c;在开发经典驱动时会用到的一个通用…

deviceiocontrol(deviceiocontrol函数)

如何用DeviceIOControl读取并口信息 应用程序和驱动程序的通信过程是&#xff1a;应用程序使用CreateFile函数打开设备&#xff0c;然后用DeviceIoControl与驱动程序进行通信&#xff0c;包括读和写两种操作。还可以用ReadFile读数据用WriteFile写数据。操作完毕时用CloseHandl…

DeviceIOControl详解-各个击破

DeviceIoControl这个api我们用的不多&#xff0c;但是很重要&#xff0c;有时会帮助我们实现一些特别的需求, 如获取硬件设备信息、与硬件设备通信&#xff08;读写数据&#xff09;等&#xff0c;对照msdn&#xff0c;下面我们详细解释一下这个api的用法&#xff08;有什么错误…

DeviceIoControl 函数详细解析

前言&#xff1a; 最近需要对Windows中的设备进行编程操作&#xff0c;其中涉及到非常重要的函数DeviceIoControl&#xff0c;在使用的时候也比较的复杂&#xff0c;国内这一块中文资料比较少&#xff0c;在学习之余顺便将其翻译出来&#xff0c;以供参考&#xff0c;如有错误&…

操作系统原理(一)——自举过程

操作系统&#xff0c;这个名词每个人都不会陌生&#xff0c;但又总觉得似乎没有了解很深&#xff0c;这一系列博客将会从零开始强化你对操作系统的认知。 1. 什么是操作系统&#xff1f; 答&#xff1a;操作系统是介于硬件与用户&#xff08;也就是程序和人&#xff09;之间的…

【操作系统基础知识 一】操作系统基本原理

学生时代没有好好学习操作系统&#xff0c;悔不当初&#xff0c;现在重新捡起来看看&#xff0c;才发现日常有很多事情都可以解释了&#xff0c;例如为什么Linux快&#xff01;并发是什么&#xff1f;操作系统到底干啥活&#xff0c;这篇blog是王道的学习笔记&#xff1a; 操作…

操作系统原理,进程的基本状态,运行态,就绪态,等待态与转换模型,进程的其他状态,创建,终止,挂起与转换模型,Linux进程状态模型示例

操作系统原理&#xff0c;进程的基本状态&#xff0c;运行态&#xff0c;就绪态&#xff0c;等待态与转换模型&#xff0c;进程的其他状态&#xff0c;创建&#xff0c;终止&#xff0c;挂起与转换模型&#xff0c;Linux进程状态模型示例 一、进程的三种基本状态&#xff1a; …

Linux操作系统基础原理

计算机系统 1.计算机体系层次 计算机自身是由众多电子元器件构成&#xff0c;硬件本身提供给用户的接口十分底层复杂&#xff0c;使用很不方便。在硬件之上的操作系统将硬件接口抽象封装为比较直观&#xff0c;用户容易调用的接口&#xff1b;用户开发应用程序&#xff0c;通过…

操作系统原理实验——实验一 Linux基本操作

1、实验目的 &#xff08;1&#xff09;熟悉Linux下的基本操作&#xff0c;学会使用各种Shell命令去操作Linux&#xff0c;对Linux有一个感性认识。 &#xff08;2&#xff09;学会使用vi编辑器编辑简单的C语言程序&#xff0c;并能对其编译和调试。 2、实验预备内容 &#…

Linux 操作系统原理 — 操作系统的本质

目录 文章目录 目录操作系统的起源操作系统和高级编程语言使硬件抽象化操作系统的起源 在操作系统尚不存在的年代,人们通过各种按钮来控制计算机,这一过程非常麻烦。于是,有人开发出了仅仅具有加载和运行功能的监控程序(Supervisor),这就是操作系统的原型。 通过监控程…

操作系统原理之多进程、多线程与并发

文章目录 (1)什么是进程&#xff1f;(2)进程的状态(3)OS何时介入进程调度&#xff1f;(4)多进程的意义(5)并行和并发(6)进程间通信(7)死锁(8)什么是线程&#xff1f;(9)多线程的意义(10)进程和线程的区别(11)Java线程和OS线程的关系 提示&#xff1a;以下是本篇文章正文内容&am…