java&jsp存取图片

  1. package com.lizhe;
  2. import java.io.*;
  3. import java.sql.*;
  4. public class PutImg {
  5.  public void putimg() {
  6.  try {
  7.    Class.forName("org.gjt.mm.mysql.Driver").newInstance();
  8.    String url = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk";
  9.    Connection conn = DriverManager.getConnection(url);
  10.    Statement stmt = conn.createStatement();
  11.    //stmt.execute("insert   into   imgt (id)   values   (5)");
  12.    stmt.close();
  13.    PreparedStatement pstmt = null;
  14.    String sql = "";
  15.    File file = new File("c://blog.jpg");
  16.    InputStream photoStream = new FileInputStream(file);
  17.    //sql = "   UPDATE   imgt   SET   img   =   ?   ";
  18.      
  19.    sql = "INSERT INTO imgtable (img) VALUES (?)";
  20.    
  21.    pstmt = conn.prepareStatement(sql);
  22.    pstmt.setBinaryStream(1, photoStream, (int) file.length());
  23.    pstmt.executeUpdate();
  24.    pstmt.close();
  25.    conn.close();
  26.  } catch (Exception e) {
  27.    e.printStackTrace();
  28.  }
  29.  }
  30.  public static void main(String args[]){
  31.  PutImg pi=new PutImg();
  32.  pi.putimg();
  33.  }
  34. }
 
前几天突然看到学校音乐站上的图片原来是存储在数据库上的,是二进制而不是使用路径保存的,在网上招了找发现大多介绍的都是hph方式,在这里做个总结,首先要存储二进制文件
 
在数据库中要搞清楚下面几个内容:
1   mysql存储大容量的二进制文件的格式是blob,其实除了图片还可以存别的
2   要向数据库存储二进制的文件一定要把要存储的数据转换成二进制流
废话就不多说了,大家看看代码很容易明白,先来看一个app程序,当然首先您要在数据库中先建立一个用于保存图片的表和相应的列,数据格式为blob
 
 
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系统上用的文件给大家参考
通过strutsaction向数据库写入二进制图片
/*
 * 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/html;charset=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   *   from imgt 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>
 
 
 
 
 
### 回答1: Java是一种面向对象的编程语言,它由Sun Microsystems开发并于1995年发布。它是用于编写各种应用程序和平台的广泛使用的语言之一。Java具有许多特性,使其在软件开发领域广泛应用。 首先,Java是一种平台无关的语言。这意味着Java代码可以在各种操作系统和设备上运行,而无需进行大量的修改。这是通过Java虚拟机(JVM)实现的,JVM可以解释和执行Java字节码。开发者只需要编写一次Java代码,然后就可以在多个平台上运行它。 其次,Java具有强大的面向对象编程能力。它支持诸如封装、继承和多态等面向对象的概念。这使开发者能够使用类和对象来组织和管理代码,使其更容易理解和维护。 此外,Java还具有丰富的类库和API(应用程序编程接口),这使开发者能够快速构建功能强大的应用程序。Java的类库覆盖了各种领域,包括图形用户界面开发、网络编程、数据库访问等。开发者可以根据自己的需求使用这些类库,从而减少了开发时间和工作量。 Java还有诸如自动内存管理、异常处理和线程支持等特性,使其在开发过程中更加安全和可靠。 总之,Java是一种功能强大、灵活且广泛应用的编程语言。它在各种场景下都有广泛的应用,包括企业软件开发、移动应用开发、游戏开发等。通过使用Java,开发者可以快速构建高质量的应用程序。 ### 回答2: Java是一种广泛应用于软件开发领域的编程语言。它是由Sun Microsystems(今已被Oracle收购)公司于1995年推出的,最初是作为Applet编写语言,用于在网页中运行小型程序。随着时间的推移,Java逐渐发展成为一种通用的、面向对象的编程语言,被广泛应用于软件开发领域。 Java的设计理念是“一次编写,到处运行”(Write Once, Run Anywhere),这意味着开发人员只需要编写一次程序,就能在不同的操作系统和硬件平台上运行。这主要依靠Java虚拟机(JVM)实现,JVM是Java程序的运行环境,负责将Java字节码翻译成机器码,从而实现跨平台的特性。 Java语言具有良好的可读性和可维护性,它采用了类、对象、继承、接口等面向对象的编程思想。Java提供了丰富的类库和API(应用程序接口),使得开发人员可以方便地进行各种功能的开发,例如用户界面、网络通信、数据库操作等。 Java语言还具有良好的安全性和可靠性。它在内存管理方面拥有自己的垃圾回收机制,减少了内存泄漏的可能性。同时,Java通过访问控制、异常处理等机制,增强了程序的安全性和稳定性。 另外,Java还具有丰富的开发工具和开发环境。例如,Eclipse和IntelliJ IDEA是常用的Java开发工具,它们提供了强大的代码编辑、调试和测试功能,加快了开发效率。 总结来说,Java作为一种通用的、面向对象的编程语言,具有跨平台、可读性强、可维护性好、安全可靠等特点。它是目前最热门和最广泛使用的编程语言之一,广泛应用于企业级的Web应用开发、移动应用开发、大数据分析等领域。 ### 回答3: Java是一种广泛应用的编程语言,由Sun Microsystems公司于1995年推出。它是一种面向对象的语言,具有简单、可移植和安全等特点,被广泛应用于各类应用程序的开发。 Java具有跨平台的特性,即一次编写,到处运行。这是因为Java代码在编译时不会直接转换成二进制代码,而是会转换为字节码,由Java虚拟机(JVM)解释执行。这使得Java程序可以在不同的操作系统上运行,无需做太多的修改。这是Java在移动设备和嵌入式系统开发中得以广泛应用的重要原因。 Java的面向对象设计使得代码更易于维护和扩展。Java提供了丰富的类库和API,开发者可以利用这些类库来快速开发各种应用程序。同时,Java还支持多线程编程,可以实现并发操作,提高程序的执行效率。 Java的安全性也是其受欢迎的原因之一。Java代码运行在Java虚拟机上,可以通过安全沙箱来限制程序的权限,防止恶意代码对系统造成破坏。此外,Java还提供了许多安全措施,如安全管理器和加密技术,以确保程序和数据的安全性。 总体而言,Java是一种功能强大、灵活且易于学习的编程语言。它在Web开发、企业级应用程序、移动设备应用程序和游戏开发等领域得到广泛应用。通过Java的跨平台特性和丰富的类库,开发者可以快速构建各种各样的应用程序,并享受java带来的便利和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值