学妹哭着找你教的Javaweb的文件上传与下载

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 该内容主要介绍了JavaWeb中的文件上传和下载操作。首先,通过一个JSP表单接收用户输入的图书信息和封面照片,表单数据提交给`AddBookServlet`。在Servlet中,使用SmartUpload库处理上传的图片,将图片以书号命名并保存至服务器,同时将图书信息存储到数据库。之后,请求转发到`ShowBook.jsp`展示所添加图书的详细信息。文件下载部分,通过`downServlet`完成,用户点击链接触发下载,Servlet设置响应头以附件形式提供文件下载。

学妹哭着找你教的Javaweb的文件上传与下载

一文件上传要求
image.png

1.编写一个包含表单的JSP文件,AddBook.jsp,其页面显示效果如下图,通过表单
可以输入图书的相关信息,并选择图书的封面照片上传。表单的action为AddBookServlet。
请注意表单enctype属性和method属性的设置。
2.编写一个JavaBean类Book,包含与数据库表book_inf的字段对应的
isbn,bookName,auther,publisher,price,amount,typeId,photo属性。用作VO(ValueObject)。
3.编写一个Servlet类AddBookServlet,该类接受AddBook.jsp表单传来的数据和图
片文件,将图片文件以书号为文件基本名,扩展名不变,保存到项目的imgs文件夹中(如:
书号为00000003的图书,上传的图片文件为“Java程序设计.jpg”,则以文件名”
00000003.jpg“保存,以避免与其他图书的图片文件重名),将图书的基本数据保存到数据库
表book_inf中,并创建相应图书的JavaBean对象book,存入request,之后转到
ShowBook.jsp。
4.编写ShowBook.jsp页面,从request中获取book,显示刚刚添加的图书的详细信息,
二文件上传的servlet

import java.io.IOException;

import java.sql.*;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
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;

import test10.Book;

@WebServlet("/AddBookServlet")

public class AddBookServlet extends HttpServlet {
   
   


    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
   
   
        request.setCharacterEncoding("UTF-8");
        //实例化对象
        SmartUpload smartUpload = new SmartUpload();
//        String oldFileName="";
        ServletConfig config = getServletConfig();
        // 初始化
        smartUpload.initialize(config, request, response);
        try {
   
   
            smartUpload.upload();//上传文件
            com.jspsmart.upload.File smartFile = smartUpload.getFiles().getFile(0); //获取上传文件
            String isbn = smartUpload.getRequest().getParameter("isbn");//获取表单输入语句
            String bookName = smartUpload.getRequest().getParameter("bookName");
            String author = smartUpload.getRequest().getParameter("auther");
            String publisher = smartUpload.getRequest().getParameter("publisher");
            String amount = smartUpload.getRequest().getParameter("amount");
            String typeld = smartUpload.getRequest().getParameter("typeld");
            String price = smartUpload.getRequest().getParameter("price");
            String oldFileName=smartFile.getFieldName();
            //保存的文件名
            String photoFileName =isbn+"."+ smartFile.getFileExt();//获取扩张名

            System.out.println("photoFileName=" + photoFileName);
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/bookstore?serverTimezone=Asia/Shanghai";

            String sql = "insert into book_info (isbn,bookName,auther,publisher,price,amount,typeld,photo) values(?,?,?,?,?,?,?,?)";
            Connection conn = DriverManager.getConnection(url, "test", "123456");
            Statement stmt=conn.createStatement();
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, isbn);
            ps.setString(2, bookName);
            ps.setString(3, author);
            ps.setString(4,publisher);
            ps.setString(5, price);
            ps.setString(6, amount);
            ps.setString(7, typeld);
            ps.setString(8, photoFileName);
            ps.executeUpdate();//将数据插入到数据库中
            ps.close();
            conn.close();
            smartFile.saveAs("imges/"+photoFileName,SmartUpload.SAVE_VIRTUAL);//保存上传文件的路径
            Book book=new Book();
            book.setIsbn(isbn);
            book.setBookName(bookName);
            book.setAuther(author);
            book.setPublisher(publisher);
            book.setAmount(amount);
            book.setTypeld(typeld);
            book.setPhoto(photoFileName);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
            request.setAttribute("book", book);
        } catch (SmartUploadException e) {
   
   
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
   
   
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
   
   
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


          RequestDispatcher rd=request.getRequestDispatcher("ShowBook.jsp");
          rd.forward(request,response);
    }
}

*创建一个实体类Book

import java.io.IOException;

import java.sql.*;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
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;

import test10.Book;

@WebServlet("/AddBookServlet")

public class AddBookServlet extends HttpServlet {
   
   


    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
   
   
        request.setCharacterEncoding("UTF-8");
        //实例化对象
        SmartUpload smartUpload = new SmartUpload();
//        String oldFileName="";
        ServletConfig config = getServletConfig();
        // 初始化
        smartUpload.initialize(config, request, response);
        try {
   
   
            smartUpload.upload();//上传文件
            com.jspsmart.upload.File smartFile = smartUpload.getFiles().getFile(0); //获取上传文件
            String isbn = smartUpload.getRequest().getParameter("isbn");//获取表单输入语句
            String bookName = smartUpload.getRequest().getParameter("bookName");
            String author = smartUpload.getRequest().getParameter("auther");
            String publisher = smartUpload.getRequest().getParameter("publisher");
            String amount = smartUpload.getRequest().getParameter("amount");
            String typeld = smartUpload.getRequest().getParameter("typeld");
            String price = smartUpload.getRequest().getParameter("price");
            String oldFileName=smartFile.getFieldName();
            //保存的文件名
            String photoFileName =isbn+"."+ smartFile.getFileExt();//获取扩张名

            System.out.println("photoFileName=" + photoFileName);
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/bookstore?serverTimezone=Asia/Shanghai";

            String sql = "insert into book_info (isbn,bookName,auther,publisher,price,amount,typeld,photo) values(?,?,?,?,?,?,?,?)";
            Connection conn = DriverManager.getConnection(url, "test", "123456");
            Statement stmt=conn.createStatement();
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, isbn);
            ps.setString(2, bookName);
            ps.setString(3, author);
            ps.setString(4,publisher);
            ps.setString(5, price);
            ps.setString(6, amount);
            ps.setString(7, typeld);
            ps.setString(8, photoFileName);
            ps.executeUpdate();//将数据插入到数据库中
            ps.close();
            conn.close();
            smartFile.saveAs("imges/"+photoFileName,SmartUpload.SAVE_VIRTUAL);//保存上传文件的路径
            Book book=new Book();
            book.setIsbn(isbn);
            book.setBookName(bookName);
            book.setAuther(author);
            book.setPublisher(publisher);
            book.setAmount(amount);
            book.setTypeld(typeld);
            book.setPhoto(photoFileName);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
            request.setAttribute("book", book);
        } catch (SmartUploadException e) {
   
   
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
   
   
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
   
   
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


          RequestDispatcher rd=request.getRequestDispatcher("ShowBook.jsp");
          rd.forward(request,response);
    }
}

文件上传并且分配一个实时文件夹

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.List;
import java.util.UUID;

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.mysql.jdbc.Statement;
@WebServlet("/AddBookServlet")

public class AddBookServlet extends HttpServlet {
   
   

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
   
   
                //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
                String savePath = this.getServletContext().getRealPath("/imges");
                //上传时生成的临时文件保存目录

                try{
   
   
                    //使用Apache文件上传组件处理文件上传步骤:
                    //1、创建一个DiskFileItemFactory工厂
                    DiskFileItemFactory factory = new DiskFileItemFactory();
                    //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
                    factory.setSizeThreshold(1024*1024*2);//设置缓冲区的大小为2KB,如果不指定,那么缓冲区的大小默认是10KB

                    //2、创建一个文件上传解析器
                    ServletFileUpload upload = new ServletFileUpload(factory);
                    //监听文件上传进度

                     //解决上传文件名的中文乱码
                    upload.setHeaderEncoding("UTF-8"); 
                    //3、判断提交上来的数据是否是上传表单的数据
                    if(!ServletFileUpload.isMultipartContent(request)){
   
   
                        //按照传统方式获取数据
                        return;
                    }

                    //设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB
                    upload.setFileSizeMax(1024*1024);
                    //设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB
                    upload.setSizeMax(1024*1024*10);
                    //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
                    List<FileItem> list = upload.parseRequest(request);
                    for(FileItem item : list){
   
   
                        //如果fileitem中封装的是普通输入项的数据
                        if(item.isFormField()){
   
   
                            String name = item.getFieldName();
                            //解决普通输入项的数据的中文乱码问题
                            String value = item.getString("UTF-8");
                            String isbn=request.getParameter("isbn");
                            String bookName=request.getParameter("bookName");
                            String auther=request.getParameter("auther");
                            String publisher=request.getParameter("publisher");
                            String price=request.getParameter("price");
                            String amount=request.getParameter("amount");
                            String typeld=request.getParameter("typeld");
                            Class.forName("com.mysql.jdbc.Driver");
                            String url ="jdbc:mysql://localhost:3306/bookstore?serverTimezone=Asia/Shanghai";
                            //3306为MySql的端口号,dalong为数据库名,root为数据库用户名,其密码为123456
                            Connection conn= DriverManager.getConnection(url,"test","123456");
                            Statement stmt=(Statement) conn.createStatement();
                            String sql="INSERT INTO BOOK_INFO VALUES('"+isbn+"','"+bookName+"','"+auther+"','"+publisher+"','"+price+"','"+amount+"','"+typeld+"')";
                            stmt.close();
                            conn.close();
                        }else{
   
   //如果fileitem中封装的是上传文件
                            //得到上传的文件名称,
                            String filename = item.getName();
                            System.out.println(filename);
                            request.getAttribute(filename);
                            if(filename==null || filename.trim().equals("")){
   
   
                                continue;
                            }

                            filename = filename.substring(filename.lastIndexOf("\\")+1);

                            InputStream in = item.getInputStream();
                            //得到文件保存的名称
                            String saveFilename = makeFileName(filename);
                            //得到文件的保存目录
                            String realSavePath = makePath(saveFilename, savePath);
                            //创建一个文件输出流
                            FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);
                            //创建一个缓冲区
                            byte buffer[] = new byte[1024];
                            //判断输入流中的数据是否已经读完的标识
                            int len = 0;
                            //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
                            while((len=in.read(buffer))>0){
   
   
                                //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
                                out.write(buffer, 0, len);
                            }
                            //关闭输入流
                            in.close();
                            //关闭输出流
                            out.close();


                        }
                    }
                }catch (Exception e) {
   
   
                    // TODO: handle exception
                }
                request.getAttribute(getServletName());
                request.getRequestDispatcher("/ShowBook.jsp").forward(request, response);
    }

    private String makeFileName(String filename){
   
     //2.jpg
        //为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
        return UUID.randomUUID().toString() + "_" + filename;
    }

    private String makePath(String filename,String savePath){
   
   
        //得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
        int hashcode = filename.hashCode();
        int dir1 = hashcode&0xf;  //0--15
        //构造新的保存目录
        String dir = savePath + "\\" + dir1 ; //upload\2\3  upload\3\5
        //File既可以代表文件也可以代表目录
        File file = new File(dir);
        //如果目录不存在
        if(!file.exists()){
   
   
            //创建目录
            file.mkdirs();
        }
        return dir;
    }


}

## 二、Jsp 的编写

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
  <head>
    <title>文件上传</title>
  </head>
  <style> 
body{
   
   text-align:center} 
.damo{
   
   
 width: 180px;
}

</style> 
  <body>
     <h3>新增图书</h3>
     <hr>

    <form action="AddBookServlet" enctype="multipart/form-data" method="post">&nbsp;&nbsp;&nbsp;&nbsp;号:<input type="text" name="isbn"><br/>&nbsp;&nbsp;&nbsp;&nbsp;名:<input type="text" name="bookName"><br/>&nbsp;&nbsp;&nbsp;&nbsp;者:<input type="text" name="auther"><br/>
        出版社:<input type="text" name="publisher"><br/>&nbsp;&nbsp;&nbsp;&nbsp;价:<input type="text" name="price"><br/>&nbsp;&nbsp;&nbsp;&nbsp;量:<input type="text" name="amount"><br/>&nbsp;&nbsp;&nbsp;&nbsp;类:<input type="text" name="typeld"><br/>
    &nbsp;&nbsp;封面图片:<input type="file" name="Photofile" class="damo"><br/>
   <input type="submit" value="提交">&nbsp;&nbsp;&nbsp;&nbsp;
   <input type="reset" value="重置">

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

三、显示图书信息

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="test10.Book" %>
<%@ page import="java.io.*" %>
<%@page import="java.sql.*" %>

<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body{
   
   
   text-align:center
}
</style>
<meta charset="UTF-8">
<title>新增图书详情</title>
</head>
<body>
  <h4>新增图书详情</h4>
  <hr>
    <%
    request.setCharacterEncoding("UTF-8");
    String isbn=request.getParameter("isbn");
    Book book=(Book)request.getAttribute("book");
    %>
<table>
 <tr>
    <td rowspan=6><img alt="" src="imges/<%=book.getPhoto() %>" width="200"></td>
    <td>&nbsp;:<%=book.getIsbn() %></td>
 </tr>
 <tr>
 <td>&nbsp;:<%=book.getBookName()%></td>
 </tr>
 <tr>
 <td>&nbsp;:<%=book.getAuther()%></td>
 </tr>
 <tr>
 <td>出版社:<%=book.getPublisher()%></td>
 </tr>
 <tr>
 <td>&nbsp;:<%=book.getPrice()%></td>
 </tr>

</table>

</body>
</html>

二、文件的下载


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 java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
 * Created by lc on 2018/8/24.
 */
@WebServlet(name = "downServlet",urlPatterns = "/abc")
public class downServlet extends HttpServlet {
   
   
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        response.setContentType("text/html;charset=utf-8");
        //获取文件名
        String filename = request.getParameter("filename");
        //文件所在的文件夹
        String folder="abc/";
        //通知浏览器以下载的方式打开
        response.addHeader("Content-Type","application/octet-stream");
        response.addHeader("Content-Disposition","attachment;filename="+filename);
        //通过文件输入流读取文件
        InputStream in=getServletContext().getResourceAsStream(folder+filename);
        OutputStream out=response.getOutputStream();
        byte[] bytes=new byte[1024];
        int len=0;
        while ((len=in.read(bytes))!=-1){
   
   
            out.write(bytes,0,len);
        }
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
<a href="/abc?filename=12.jpg">文件下载</a>
</body>
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
25 4
|
24天前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
|
1月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
32 2
|
1月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
48 5
|
1月前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
455 1
|
1月前
|
Java
java 文件上传和下载
java 文件上传和下载
21 0
|
6月前
|
存储 Java Windows
Java21 JDK下载安装及Windows环境变量配置
JDK是Java的开发工具包,要进行Java学习或开发之前,需先下载安装,下载地址如下:提示:这网址里面有三个扩展名的文件,分别是“.zip”、“.exe”和“.msi”,鄙人选择的是.exe的文件,下方的安装和环境的配置也是安装该文件的安装程序进行的。
815 2
|
Oracle Java 关系型数据库
java17的下载与安装
java17的下载与安装
1580 0
|
Oracle Java Unix
Java/JDK下载、安装与环境变量配置超详细教程(2022更新)保姆级,秒会
Java/JDK下载、安装与环境配置超详细教程(2022更新)保姆级,小白秒会[学习必备,建议收藏]。包含JDK8、JDK11、JDK17、JDK19等,本文将从JDK的下载与安装讲起,在从配置到第一个HelloWrold实践结束。在观看本文前我们需要知道JDK是什么,有什么作用?JDK是Java的开发工具包,包括JVM虚拟机,核心类库,开发工具。
18543 0
Java/JDK下载、安装与环境变量配置超详细教程(2022更新)保姆级,秒会
WXM
|
4月前
|
Oracle Java 关系型数据库
Java JDK下载安装及环境配置超详细图文教程
Java JDK下载安装及环境配置超详细图文教程
WXM
647 3