加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

使用Java Servlet从数据库上传和下载文件

发布时间:2023-04-01 11:15:53 所属栏目:教程 来源:
导读:在本文档中,我将指导您上载文件并将其存储在数据库中数据类型为BLOB的列中,然后从数据库中数据类型为BLOB的列中下载文件。

创建数据库

您可以使用任何数据库,下面是用于创建upload表的脚本,该表用于存储您
在本文档中,我将指导您上载文件并将其存储在数据库中数据类型为BLOB的列中,然后从数据库中数据类型为BLOB的列中下载文件。

创建数据库

您可以使用任何数据库,下面是用于创建upload表的脚本,该表用于存储您上载的数据文件。

CREATE TABLE `upload` (
    `id` VARCHAR(50) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci',`file` LONGBLOB NOT NULL,`filename` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci',PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;
上传文件并存储在数据库中

fileupload.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
 
<html>
    <head>
        <title>文件上传到数据库</title>
        <Meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form method="POST" action="FileUpload" enctype="multipart/form-data" >
            <table>
                <tr><td>Id</td>
                    <td><input type="text" name="id" /></td>
                <tr>
                    <td>File</td>
                       <td><input type="file" name="file" id="file" /> </td>
                </tr>
                <tr>
            <td colspan="2">
                <input type="submit" value="Upload" name="upload" id="upload" /> </td>
            </tr>
       </table>
    </form>
   </body>
</html>
FileUpload.java

//中文
 
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.sqlException;
import java.sql.Statement;
 
import javax.servlet.servletexception;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
 
@WebServlet("/FileUpload")
@MultipartConfig
public class FileUpload extends HttpServlet {
 
    /**
     *
     */
    private static final long serialVersionUID = 1L;
 
    protected void doPost(HttpServletRequest request,HttpServletResponse response)throws servletexception,IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        
        final Part filePart = request.getPart("file");
        String id = request.getParameter("id");
 
        InputStream FileBytes = null;
        final PrintWriter writer = response.getWriter();
 
        try {
 
          //if (!filePart.getContentType().equals("image/jpeg"))
          //  {
          //             writer.println("<br/> Invalid File");
          //             return;
          //  }
 
          // else if (filePart.getSize()>1048576 ) { //2mb
          //     {
          //    writer.println("<br/> File size too big");
          //    return;
          //     }
          // }
 
            String filename = filePart.getSubmittedFileName();
            FileBytes = filePart.getInputStream();  // to get the body of the request as binary data
 
            final byte[] bytes = new byte[FileBytes.available()];
             FileBytes.read(bytes);  //Storing the binary data in bytes array.
 
            Connection  con=null;
             Statement stmt=null;
 
               try {
                     Class.forName("com.MysqL.cj.jdbc.Driver");
                     con = DriverManager.getConnection("jdbc:MysqL://localhost:3306/test?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","root");
                  } catch (Exception e) {
                        System.out.println(e);
                        System.exit(0);
                              }
                int success=0;
                PreparedStatement pstmt = con.prepareStatement("INSERT INTO upload VALUES(?,?,?)");
                pstmt.setString(1,id);
                pstmt.setBytes(2,bytes);    //Storing binary data in blob field.
                pstmt.setString(3,filename);    //Storing binary data in blob field.
                success = pstmt.executeUpdate();
                if(success>=1)  System.out.println("Data Stored");
                 con.close(); 
 
                 writer.println("<br/> Book Successfully Stored");
 
        } catch (FileNotFoundException fnf) {
            writer.println("You  did not specify a file to upload");
            writer.println("<br/> ERROR: " + fnf.getMessage());
 
        } catch (sqlException e) {
            // Todo Auto-generated catch block
            e.printstacktrace();
        } finally {
 
            if (FileBytes != null) {
                FileBytes.close();
            }
            if (writer != null) {
                writer.close();
            }
        }
 
    }
 
}
使用Stream

//中文
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.sqlException;
import java.sql.Statement;
import javax.servlet.servletexception;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet("/FileUpload")
@MultipartConfig
public class FileUpload extends HttpServlet {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        final Part filePart = request.getPart("file");
        String id = request.getParameter("id");
        InputStream FileBytes = null;
        final PrintWriter writer = response.getWriter();
        Connection con = null;
        Statement stmt = null;
        try {
            //if (!filePart.getContentType().equals("image/jpeg"))
            //  {
            //             writer.println("<br/> Invalid File");
            //             return;
            //  }
            // else if (filePart.getSize()>1048576 ) { //2mb
            //     {
            //    writer.println("<br/> File size too big");
            //    return;
            //     }
            // }
            String filename = filePart.getSubmittedFileName();
            FileBytes = filePart.getInputStream(); // to get the body of the request as binary data
            try {
                Class.forName("com.MysqL.cj.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:MysqL://localhost:3306/test?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root");
            } catch (Exception e) {
                System.out.println(e);
                System.exit(0);
            }
            int success = 0;
            PreparedStatement pstmt = con.prepareStatement("INSERT INTO upload VALUES(?,?)");
            pstmt.setString(1,id);
            pstmt.setBinaryStream(2,FileBytes); //Storing binary data in blob field.
            pstmt.setString(3,filename); //Storing binary data in blob field.
            success = pstmt.executeUpdate();
            if (success >= 1) System.out.println("Data Stored");
            con.close();
            writer.println("<br/> File Successfully Uploaded");
        } catch (FileNotFoundException fnf) {
            writer.println("You  did not specify a file to upload");
            writer.println("<br/> ERROR: " + fnf.getMessage());
        } catch (sqlException e) {
            // Todo Auto-generated catch block
            e.printstacktrace();
        } finally {
            if (con != null) {
                // closes the database connection
                try {
                    con.close();
                } catch (sqlException ex) {
                    ex.printstacktrace();
                }
            }
            if (FileBytes != null) {
                FileBytes.close();
            }
            if (writer != null) {
                writer.close();
            }
        }
    }
}
从数据库中下载文件

download.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<Meta charset="ISO-8859-1">
<title>从数据库下载文件</title>
</head>
<body>
    <form action="DBFileDownload" method="get">
        <input type="text" name="id">
        <input type="submit" value="getfile">
        </form>
</body>
</html>
DBFileDownloadServlet.java

//中文
 
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.sqlException;
 
import javax.servlet.servletexception;
import javax.servlet.ServletoutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
 
/**
 * Servlet implementation class GetDetails
 */
@WebServlet("/DBFileDownload")
public class DBFileDownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
        
      protected void doGet(HttpServletRequest request,IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        
        String id = request.getParameter("id")!=null?request.getParameter("id"):"NA";
         
        ServletoutputStream sos;
        Connection  con=null;
        PreparedStatement pstmt=null;
         
 
 
         sos = response.getoutputStream();
         
 
           try {
               Class.forName("com.MysqL.cj.jdbc.Driver");
               con = DriverManager.getConnection("jdbc:MysqL://localhost:3306/test?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root");
          } catch (Exception e) {
                     System.out.println(e);
                     System.exit(0); 
                          }
            
          ResultSet rset=null;
            try {
                pstmt = con.prepareStatement("Select file,filename from upload where id=?");
                System.out.println("Select file,filename from upload where id="+id.trim());
                pstmt.setString(1,id.trim());
                rset = pstmt.executeQuery();
                if (rset.next()) {
                    response.setContentType("APPLICATION/OCTET-STREAM");
                    
                    response.setHeader("Content-disposition","inline; filename*=UTF-8''" + URLEncoder.encode(rset.getString("filename"),"UTF-8"));
                    sos.write(rset.getBytes("file"));
                    System.out.println(rset.getBytes("file"));
                    System.out.println(rset.getString("filename"));
                }
                else
                    return;
                 
            } catch (sqlException e) {
                // Todo Auto-generated catch block
                e.printstacktrace();
            }
     
        sos.flush();
        sos.close();
         
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request,HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request,IOException {
        // Todo Auto-generated method stub
    }
 
}
使用Stream

//中文
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.sqlException;
import java.sql.Statement;
import javax.servlet.servletexception;
import javax.servlet.ServletoutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.io.InputStream;
/**
 * Servlet implementation class GetDetails
 */
@WebServlet("/DBFileDownload")
public class DBFileDownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request,IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        String id = request.getParameter("id") != null ? request.getParameter("id") : "NA";
        ServletoutputStream sos;
        Connection con = null;
        PreparedStatement pstmt = null;
        sos = response.getoutputStream();
        ResultSet rset = null;
        try {
            try {
                Class.forName("com.MysqL.cj.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:MysqL://localhost:3306/test?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root");
            } catch (Exception e) {
                System.out.println(e);
                System.exit(0);
            }
            pstmt = con.prepareStatement("Select file,filename from upload where id=?");
            System.out.println("Select file,filename from upload where id=" + id.trim());
            pstmt.setString(1,id.trim());
            rset = pstmt.executeQuery();
            if (rset.next()) {
                response.setContentType("APPLICATION/OCTET-STREAM");
                response.setHeader("Content-disposition","UTF-8"));
                InputStream inputStream = rset.getBinaryStream("file");
                int i;
                while ((i = inputStream.read()) != -1) {
                    sos.write(i);
                }
                System.out.println(rset.getBytes("file"));
                System.out.println(rset.getString("filename"));
            } else
                return;
        } catch (sqlException e) {
            // Todo Auto-generated catch block
            e.printstacktrace();
        } finally {
            if (con != null) {
                // closes the database connection
                try {
                    con.close();
                } catch (sqlException ex) {
                    ex.printstacktrace();
                }
            }
        }
        sos.flush();
        sos.close();
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request,IOException {
        // Todo Auto-generated method stub
    }
}
使用Stream消耗内存少于使用字节数组。
 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章