logo资料库

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

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
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=g bk"; into imgt (id) Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); //stmt.execute("insert stmt.close(); PreparedStatement pstmt = null; String sql = ""; File file = new File("c:\\blog.jpg"); InputStream photoStream = new FileInputStream(file); img //sql = " UPDATE imgt SET values (5)"); = ? "; 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 \0 \0\0\0 \0 \0\0 \0 \0\0\0 \0\0\0j \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 语句 \0 \0\0\0 \0\0\0b (\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 \0H\0H\0\0?? Exif\0\0MM\0*\0\0\0 \0 然后我们再来写一个 app 程序将这个文件读出来,存储成一个图片文件 package com.lizhe; import java.io.*; import java.sql.*; class GetImg { static final String private = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=g bk"; private Connection conn = null; private PreparedStatement pstmt = null; private ResultSet rs = null; private File file = null; URL 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 path="/userhomepage.jsp" contextRelative="true" */ public class UpimgAction extends Action { /* name="userhome" * Generated Methods */ /** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward * @throws IOException redirect="true"
* @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=g b2312"; into values img (id) Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); //stmt.execute("insert stmt.close(); PreparedStatement pstmt = null; String sql = ""; //File file = new File("c:\\blog.jpg"); //InputStream photoStream = new FileInputStream(file); img //sql = " UPDATE imgt SET (5)"); = ? "; 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/html;charset=gb2312"%> <%@ page import="java.sql.*" %>
<%@ <%@ <%@ page page page import="java.util.*"%> import="java.text.*"%> import="java.io.*"%> <%@ page import="java.awt.*"%> <% Class.forName("org.gjt.mm.mysql.Driver").newInstance(); String url="jdbc:mysql://localhost/img?user=root&password=root"; Connection String Statement stmt = con.createStatement(); DriverManager.getConnection(url); "select sql con = = * from imgt where id=5"; 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(); %>
分享到:
收藏