jsp如何上传照片到mysql,再查询在jsp中显示

jsp如何上传照片到mysql,再查询在jsp中显示,第1张

1 mysql存储大容量的二进制文件的格式是longblob ,其实除了图片还可以存别的

CREATE TABLE`abc`.`images` (

`name` varchar(10) NOT NULL,

`changdu` int(10) unsigned NOT NULL,

`content` longblob NOT NULL,

PRIMARY KEY (`name`)

)

ENGINE=InnoDB DEFAULT CHARSET=utf8

2 要向数据库存储二进制的文件一定要把要存储的数据转换成二进制流

废话就不多说了,大家看看代码很容易明白,先来看一个app程序,当然首先您要在数据库中先建立一个用于保存图片的表和相应的列,

数据格式为blob

package com.lizhe

import java.io.*

import java.sql.*

public class PutImg {

public void putimg() {

try {

Class.forName("org.gjt.mm.mysql.Driver").newInstance()

String url = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk"

Connection conn = DriverManager.getConnection(url)

Statement stmt = conn.createStatement()

//stmt.execute("insert into imgt (id) values (5)")

stmt.close()

PreparedStatement pstmt = null

String sql = ""

File file = new File("c:\\blog.jpg")

InputStream photoStream = new FileInputStream(file)

//sql = " UPDATE imgt SET img = ? "

sql = "INSERT INTO imgtable(img) VALUES (?)"

pstmt = conn.prepareStatement(sql)

pstmt.setBinaryStream(1, photoStream, (int) file.length())

pstmt.executeUpdate()

pstmt.close()

conn.close()

} catch (Exception e) {

e.printStackTrace()

}

}

public static void main(String args[]){

PutImg pi=new PutImg()

pi.putimg()

}

}

InputStream photoStream = new FileInputStream(file)

可以很清楚的看到我们首先把一个图片文件(当然也可以是别的什么文件)转换成了一个二进制输入流

pstmt.setBinaryStream(1, photoStream, (int) file.length())

这个方法建议大家去查一下API文档,第一个参数是通配符位置没的说,第二个参数是流,这和以往的string类型的参数不太一样,

我刚看到的时候也觉得豁然开朗了,但是到这里还没完,不同于以往的字符串参数,这里我们还需要第三个参数来设置这个流的长度,

这里也就是这个文件的长度,导出数据库中的sql,一切都清楚了

INSERT INTO `m_diy` VALUES (2,?\0 JFIF\0 \0H\0H\0\0?? Exif\0\0MM\0*\0\0\0 \0\0 \0\0\0 \0 \0\0\0 \0\0\0 \0\0\0b

\0 \0\0\0 \0\0\0j (\0 \0\0\0 \0 \0\0 1\0 \0\0\0 \0\0\0r 2\0 \0\0\0 \0\0\0?i\0 \0\0\0 \0\0\0\0\0\0\0\0\0H\0\0\0

\0\0\0H\0\0\0 Adobe Photoshop CS Windows\02007:03:18 23:08:15\0\0\0\0\0 ?\0 \0\0\0 ??\0\0?\0 \0\0\0 \0\0\0? \0

........等等

其实就是将文件先转换成了二进制的流,然后插入到了sql语言中,向数据库写入了很长很长的一段sql语句

然后我们再来写一个app程序将这个文件读出来,存储成一个图片文件

package com.lizhe

import java.io.*

import java.sql.*

class GetImg {

private static final String URL = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk"

private Connection conn = null

private PreparedStatement pstmt = null

private ResultSet rs = null

private File file = null

public void blobRead(String outfile, int picID) throws Exception {

FileOutputStream fos = null

InputStream is = null

byte[] Buffer = new byte[4096]

try {

Class.forName("org.gjt.mm.mysql.Driver").newInstance()

conn = DriverManager.getConnection(URL)

pstmt = conn.prepareStatement("select img from imgt where id=?")

pstmt.setInt(1, picID)// 传入要取的图片的ID

rs = pstmt.executeQuery()

rs.next()

file = new File(outfile)

if (!file.exists()) {

file.createNewFile()// 如果文件不存在,则创建

}

fos = new FileOutputStream(file)

is = rs.getBinaryStream("img")

int size = 0

while ((size = is.read(Buffer)) != -1) {

// System.out.println(size)

fos.write(Buffer, 0, size)

}

} catch (Exception e) {

System.out.println( e.getMessage())

} finally {

// 关闭用到的资源

fos.close()

rs.close()

pstmt.close()

conn.close()

}

}

public static void main(String[] args) {

try {

GetImg gi=new GetImg()

gi.blobRead("c:/getimgs/1.jpg", 5)

} catch (Exception e) {

System.out.println("[Main func error: ]" + e.getMessage())

}

}

}

这里需要注意的是

is = rs.getBinaryStream("img")

img是数据库中相应的列名,其实和rs.getString()方法差不多,只不过这个方法是读取二进制流的

最后在帖两个bs系统上用的文件给大家参考

通过struts的action向数据库写入二进制图片

/*

* Generated by MyEclipse Struts

* Template path: templates/java/JavaClass.vtl

*/

package com.lizhe.struts.action

import java.io.File

import java.io.FileInputStream

import java.io.FileNotFoundException

import java.io.IOException

import java.io.InputStream

import java.sql.Connection

import java.sql.DriverManager

import java.sql.PreparedStatement

import java.sql.Statement

import javax.servlet.http.HttpServletRequest

import javax.servlet.http.HttpServletResponse

import org.apache.struts.action.Action

import org.apache.struts.action.ActionForm

import org.apache.struts.action.ActionForward

import org.apache.struts.action.ActionMapping

import org.apache.struts.upload.FormFile

import com.lizhe.struts.form.UpimgForm

/**

* MyEclipse Struts

* Creation date: 05-18-2007

*

* XDoclet definition:

* @struts.action path="/upimg" name="upimgForm" input="/userhomepage.jsp"

* @struts.action-forward name="userhome" path="/userhomepage.jsp" redirect="true" contextRelative="true"

*/

public class UpimgAction extends Action {

/*

* Generated Methods

*/

/**

* Method execute

* @param mapping

* @param form

* @param request

* @param response

* @return ActionForward

* @throws IOException

* @throws FileNotFoundException

*/

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, IOException {

UpimgForm upimgForm = (UpimgForm) form// TODO Auto-generated method stub

FormFile file=upimgForm.getFile()

InputStream is=file.getInputStream()

try {

Class.forName("org.gjt.mm.mysql.Driver").newInstance()

String url = "jdbc:mysql://localhost/blog?user=root&password=root&useUnicode=true&characterEncoding=gb2312"

Connection conn = DriverManager.getConnection(url)

Statement stmt = conn.createStatement()

//stmt.execute("insert into img (id) values (5)")

stmt.close()

PreparedStatement pstmt = null

String sql = ""

//File file = new File("c:\\blog.jpg")

//InputStream photoStream = new FileInputStream(file)

//sql = " UPDATE imgt SET img = ? "

sql = "INSERT INTO img (img) VALUES (?)"

pstmt = conn.prepareStatement(sql)

pstmt.setBinaryStream(1, is, (int) file.getFileSize())

pstmt.executeUpdate()

pstmt.close()

conn.close()

} catch (Exception e) {

e.printStackTrace()

}

return mapping.findForward("userhomepage")

}

}

和app的方式几乎是一样的

第二个文件是通过jsp将数据库中的图片显示在页面上

这个有些不同

<%@ page contentType="text/htmlcharset=gb2312"%>

<%@ page import="java.sql.*" %>

<%@ page import="java.util.*"%>

<%@ page import="java.text.*"%>

<%@ page import="java.io.*"%>

<%@ page import="java.awt.*"%>

<html>

<body>

<%

Class.forName("org.gjt.mm.mysql.Driver").newInstance()

String url="jdbc:mysql://localhost/img?user=root&password=root"

Connection con = DriverManager.getConnection(url)

String sql = "select * fromimgt where id=5"

Statement stmt = con.createStatement()

ResultSet rs = stmt.executeQuery(sql)

if(rs.next()) {

InputStream in = rs.getBinaryStream("img")

ServletOutputStream op = response.getOutputStream()

int len

byte[] buf=new byte[1024]

while((len= in.read(buf))!=-1) {

op.write(buf, 0, len)

}

op.close()

in.close()

}

rs.close()

stmt.close()

con.close()

%>

</body>

</html>

jsp上传图片到数据,在数据库中有一种类型就是blob存储类型,就是用于储存二进制的。在java.sql里面的PreparedStatment有个setBlob()方法存入数据库,还有ResultSet里的getBlob()就是读取,详情你可以看JDBC Blob如何使用。

在jsp里上传图片很少用上述方式存储到数据库中,一般是将图片上传到服务器项目目录文件夹中,然后数据库中保存该图片文件的地址,如/item/upload/images/我上传的图片.jpg

jsp语言不是很懂,获取到图片后,需要进行一些处理(重命名、保存到本机上等 *** 作),之后一般是把这个图片处理后的保存到本机上的路径(绝对路径)存到数据库中,以后在从数据库中查询图片信息时,调出来的是该图片的路径 如果使用html语言将其输出的话。就是这样的:<img src="数据库中读出来的图片路径" />


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9915262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存