我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 运维优化 > 怎么使用commons-fileupload将图片上传至mysql数据库
总共48087条微博

动态微博

查看: 2957|回复: 1

怎么使用commons-fileupload将图片上传至mysql数据库

[复制链接]

57

主题

5

听众

129

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-04-07 17:37:14 |只看该作者 |倒序浏览
本文将阐述怎么使用commons-fileupload将图片上传至mysql数据库,并利用java servlet将其在浏览器中显示

出来。

前提条件:

正确安装了mysql,tomcat,并下载了commons-fileupload-1.0.jar。

1,前台页面

---test_upload.htm---

<html>
<head>
<title>
上传测试
</title>
<body>
<form action="upload.jsp" enctype="multipart/form-data" method="post">
your name:
<br>
<input type="text" name="name">
<br>
file to process:
<input type="file" name="userfile">
<br>
<input type="submit">
</form>
</body>
</html>

2,上传的后台处理页面

---upload.jsp---

<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.sql.*"%>

<%@ page import="java.util.*"%>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="com.cf.model.DbManipulate" %>
<%
        DiskFileUpload upload=new DiskFileUpload();
        upload.setSizeThreshold(4096);
        upload.setRepositoryPath("d:/java/");
        upload.setSizeMax(10000000);
        List fileItems = upload.parseRequest(request);
        Iterator i = fileItems.iterator();
        String name = ((FileItem)i.next()).getString();
        FileItem fi = (FileItem)i.next();
        String fileName = fi.getName();
  //System.out.println(fileName);
  fileName = fileName.replace(':','_');
        fileName = fileName.replace('\\','_');
  //System.out.println(fileName);
        //File savedFile = new File("d:/java/upload/",fileName);
        //fi.write(savedFile);
  InputStream fis=fi.getInputStream();
        DbManipulate dm=new DbManipulate();
  Long long_size=new Long(fi.getSize());
  int size=long_size.intValue();
  PreparedStatement ps=dm.DbUpdate("insert into photo(image,description) values(?,?)");
  ps.setBinaryStream(1,fis,size);
  ps.setString(2,fileName);
  ps.executeUpdate();
  String sql="select id from photo order by id desc limit 1";
  PreparedStatement ps2=dm.DbQuery(sql);
  ResultSet rs=ps2.executeQuery();
  int index=0;
  if(rs.next())
  {
   index=rs.getInt(1);
  }
  //ps.close();
  //fis.chose();
%>
<%=name%>  <a href="javascript:history.go(-1)">go on</a>
<br>
<iframe height="600" width="800" src=photoview?id=<%=index%> scrolling=true>

3,显示图片的servlet

---BlobServlet.java----

package com.cf.photo;

import java.io.*;
import java.sql.*;
import javax.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;

import com.cf.model.*;

public class BlobServlet extends HttpServlet{
//private static Log log = LogFactory.getLog(BlobServlet.class);

protected void doGet(HttpServletRequest request,HttpServletResponse response)
  throws ServletException,IOException{

  ServletOutputStream out=response.getOutputStream();
  int id=Integer.parseInt(request.getParameter("id"));
  response.setContentType("image/jpeg");
  out.write(getBlob(id));
  out.flush();
  out.close();
}
public byte[] getBlob(int photoid){
  String sql="select image from photo where id=?";
  //log.info(sql);
  Blob blob=null;
  byte[] bytes=null;
  //String description="";
  PreparedStatement pstmt=null;
  ResultSet rs=null;
  DbManipulate mydb=new DbManipulate();
  try{
   pstmt=mydb.DbQuery(sql);
   pstmt.setInt(1,photoid);
   rs=pstmt.executeQuery();
   while(rs.next()){
    blob=rs.getBlob(1);
   }
   bytes=blob.getBytes(1,(int)(blob.length()));
  }catch(SQLException e){}
  return bytes;
}
}

4,存储图片的表定义:

create database web_exam;

use web_exam;

create table photo(

id int not null auto_increment primary key,

image mediumblob not null,

description varchar(100) null

);

5,应用程序的目录结构

%catalina_home%\webapps\demo

------test_upload.htm

------upload.jsp

------WEB-INF

             |----web.xml

             |-----build.xml

             |-----lib

                     |-------mysql-connector-java-3.0.16-ga-bin.jar

                     |-------commons-fileupload-1.0.jar

             |----src

                     |----com

                             |-----cf

                                     |-----photo

                                                |-----BlobServlet.java

                                     |-----model

                                                |----DbConnection.java

                                                |----DbConst.java

                                                |----DbManipulate.java

6,web.xml文件内容

<?xml version="1.0"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">

<web-app>

<servlet>
        <servlet-name>photoview</servlet-name>
        <servlet-class>com.cf.photo.BlobServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>photoview</servlet-name>
        <url-pattern>/photoview/*</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
       <welcome-file>default.jsp</welcome-file>
       <welcome-file>index.jsp</welcome-file>
       <welcome-file>test.jsp</welcome-file>
       </welcome-file-list>

</web-app>


7,ant的buildfile内容

------build.xml------

<project name="buildweb" default="build" basedir=".">
  <property name="src" location="src"/>
  <property name="lib" location="lib"/>
  <property name="build" location="classes"/>
  <target name="build">
       <mkdir dir="${build}" />
       <javac srcdir="${src}" destdir="${build}">
           <include name="**/*.java" />
       </javac>
   </target>
   <target name="create-jars" depends="build">

    <jar destfile="${lib}/myexam.jar" basedir="${build}"/>
     </target>

   <target name="clean" depends="create-jars">
       <delete dir="${build}"/>
        </target>
   </project>

8,DbConst.java

package com.cf.model;

public interface DbConst{
public final static String JDBC_DRIVER="com.mysql.jdbc.Driver";
public final static String JDBC_URL="jdbc:mysql://localhost:3306/web_exam?"
                                    +"useUnicode=true&characterEncoding=GB2312";
public final static String JDBC_USER="root";
public final static String JDBC_PASS="chenfu";
}

9,DbConnection.java

package com.cf.model;
import java.sql.*;
public class DbConnection implements DbConst{

    private String jdbcDriver=JDBC_DRIVER;
private String databaseURL=JDBC_URL;
private String dbUsername=JDBC_USER;
private String dbPassword=JDBC_PASS;
private Connection con=null;
public String getJdbcDriver(){
  return this.jdbcDriver;
}
public void setJdbcDriver(String d){
  this.jdbcDriver=d;
}
public String getDatabaseURL(){
  return this.databaseURL;
}
public void setDatabaseURL(String url){
  this.databaseURL=url;
}
public String getDbUsername(){
  return this.dbUsername;
}
public void setDbUsername(String u){
  this.dbUsername=u;
}

public String getDbPassword(){
  return this.dbPassword;
}
public void setDbPassword(String p){
  this.dbPassword=p;
}
public boolean isConnected(){
  return (con!=null);
}
public void disconnected(){
  if(con!=null){
   try
   {
    con.close();
   }
   catch (SQLException ignore)
   {
   }
   finally {
    con=null;
   }
  }
}
public void setCon(Connection c){
  this.con=c;
}
public Connection getCon() throws SQLException{
  if(isConnected()) throw new SQLException("Already connected");
  if(jdbcDriver==null) throw new SQLException("No jdbcDriver property");
  if(databaseURL==null) throw new SQLException("No jdbcURL property");
  try
  {
   Class.forName(jdbcDriver);
   //log.info(jdbcDriver);
  }
  catch (ClassNotFoundException e)
  {
   throw new SQLException(jdbcDriver+"class could not loaded");
  }
  con=DriverManager.getConnection(databaseURL,dbUsername,dbPassword);
  return con;
}
}


10,DbManipulate.java

package com.cf.model;
import java.sql.*;
public class DbManipulate{
private Connection con=null;
private PreparedStatement pstmt=null;

public PreparedStatement DbQuery(String sql)throws SQLException{
  DbConnection newcon=new DbConnection();
  con=newcon.getCon();
  pstmt=con.prepareStatement(sql,
  ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
  //log.info(sql);
  return pstmt;
}
public PreparedStatement DbUpdate(String sql)throws SQLException{
  DbConnection newcon=new DbConnection();
  con=newcon.getCon();
  pstmt=con.prepareStatement(sql);
  return pstmt;
}
public void DbClose(){
   if(pstmt!=null){
    pstmt=null;
     }
}
}

11,转到该web application的WEB-INF下,在命令行中执行ant,以编译源文件,然后打开tomcat服务器,

在浏览器中打开地址:http://localhost:8080/demo/test_upload.htm,试着去上传一张jpg的图片,看看行不行。


科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

3

主题

3

听众

1211

金钱

五袋长老

该用户从未签到

沙发
发表于 2016-03-25 16:54:40 |只看该作者
写成一个小demo比贴代码好些..
回复

使用道具 举报

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表