JSP实现图片上传到MySQL数据库
4星 · 超过85%的资源 需积分: 17 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获取图片,并在浏览器中显示出来。这种方法虽然比传统方式复杂,但对于需要动态管理图片的应用程序,它提供了更高的灵活性和可控性。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2013-05-16 上传
2022-09-19 上传
点击了解资源详情
2023-05-25 上传
2023-05-31 上传
2023-05-25 上传
李先森丶
- 粉丝: 21
- 资源: 42
最新资源
- MATLAB新功能:Multi-frame ViewRGB制作彩色图阴影
- XKCD Substitutions 3-crx插件:创新的网页文字替换工具
- Python实现8位等离子效果开源项目plasma.py解读
- 维护商店移动应用:基于PhoneGap的移动API应用
- Laravel-Admin的Redis Manager扩展使用教程
- Jekyll代理主题使用指南及文件结构解析
- cPanel中PHP多版本插件的安装与配置指南
- 深入探讨React和Typescript在Alias kopio游戏中的应用
- node.js OSC服务器实现:Gibber消息转换技术解析
- 体验最新升级版的mdbootstrap pro 6.1.0组件库
- 超市盘点过机系统实现与delphi应用
- Boogle: 探索 Python 编程的 Boggle 仿制品
- C++实现的Physics2D简易2D物理模拟
- 傅里叶级数在分数阶微分积分计算中的应用与实现
- Windows Phone与PhoneGap应用隔离存储文件访问方法
- iso8601-interval-recurrence:掌握ISO8601日期范围与重复间隔检查