JSP实现图片上传到MySQL数据库

4星 · 超过85%的资源 需积分: 17 87 下载量 201 浏览量 更新于2024-09-13 收藏 62KB DOC 举报
"在开发基于Web的数据库应用时,经常需要处理图片的存储和展示。传统的做法是将图片存储在服务器的特定目录下,并在数据库中仅存储图片的路径。然而,为了实现动态显示图片,这种方法就显得不足,需要将图片以二进制数据的形式直接存储到数据库中。本文主要探讨如何使用JSP和MySQL来实现这个功能。" 在JSP中将图片上传到MySQL数据库,首先需要创建一个能够存储图片信息的数据表。以下是一个简单的SQL脚本,用于创建名为`p`的表,包含`picid`(主键,自动递增)、`picname`(图片名称)和`pic`(二进制图片数据)三个字段: ```sql IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[p]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [dbo].[p] GO CREATE TABLE [dbo].[p] ( [picid] [int] IDENTITY(1,1) NOT NULL, [picname] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, [pic] [image] NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ``` 接下来,我们需要创建一个JSP文件来处理图片的上传。在Dreamweaver MX中,你可以创建一个新的JSP页面,例如`InputImage.jsp`,包含以下基本结构: ```jsp <%@ page contentType="text/html;charset=gb2312" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%= basePath %>"> <title>MyJSP 'InputImage.jsp' starting page</title> <!-- Meta tags for cache control --> </head> <body> <!-- Form for image upload --> <form action="UploadImage.jsp" method="post" enctype="multipart/form-data"> Select image to upload: <input type="file" name="imageFile"> <input type="submit" value="Upload Image"> </form> </body> </html> ``` 在这个页面中,用户可以选择本地的图片文件并提交。提交后,需要另一个JSP页面(如`UploadImage.jsp`)来处理文件上传并将其存储到数据库: ```jsp <%@ page import="java.io.*,java.sql.*" %> <% // 获取上传的文件 Part filePart = request.getPart("imageFile"); String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // 读取文件内容到字节数组 InputStream fileContent = filePart.getInputStream(); byte[] imageData = new byte[fileContent.available()]; fileContent.read(imageData); // 数据库连接配置 Connection conn = null; PreparedStatement pstmt = null; try { // 连接数据库 Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_database", "username", "password"); // 准备插入图片数据的SQL语句 String sql = "INSERT INTO p(picname, pic) VALUES (?, ?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, fileName); pstmt.setBytes(2, imageData); // 执行SQL int rowsInserted = pstmt.executeUpdate(); if (rowsInserted > 0) { out.println("Image uploaded successfully."); } } catch (Exception e) { out.println("Error uploading image: " + e.getMessage()); } finally { // 关闭数据库连接 try { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } %> ``` 这个`UploadImage.jsp`页面首先读取上传文件的内容,然后建立到MySQL数据库的连接,并准备一个SQL插入语句,将图片名称和二进制数据插入到`p`表中。一旦图片成功存储,页面会显示一条成功消息。 要从数据库中检索并显示图片,可以创建一个JSP页面,根据图片ID或名称查询数据库,然后将图片数据写入响应流,如下所示: ```jsp <%@ page import="java.io.*,java.sql.*" %> <% String picId = request.getParameter("id"); // 假设通过URL参数传递图片ID Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_database", "username", "password"); // 查询图片数据 String sql = "SELECT pic FROM p WHERE picid = ?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, Integer.parseInt(picId)); rs = pstmt.executeQuery(); if (rs.next()) { byte[] imageData = rs.getBytes("pic"); response.setContentType("image/jpeg"); // 根据图片类型设置 OutputStream outputStream = response.getOutputStream(); outputStream.write(imageData); outputStream.flush(); outputStream.close(); } else { out.println("Image not found."); } } catch (Exception e) { out.println("Error retrieving image: " + e.getMessage()); } finally { try { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } %> ``` 这样,你就可以通过数据库ID获取图片,并在浏览器中显示出来。这种方法虽然比传统方式复杂,但对于需要动态管理图片的应用程序,它提供了更高的灵活性和可控性。