批量把文件(图片)导入到数据库

时间:2022-09-20 12:40:08

客户给了几百张用户的照片,照片的名称格式是:护照号+格式。

本来打算直接放到服务器上的,但是考虑到以后的数据会越来越大,就打算存在数据库了。

就写了 一个java后台来批量导入。


想法很简单:

           图片也是文件的一种,我这里用图片说。

           我们知道客户给我的图片是放在一个文件夹里的,我们第一步获取文件里的所有的文件名,然后写一个循环就可以直接读取了,但是在写的过程中有几点需要注意的,我贴下源码我会特意说明:

          第一步:

               建立数据库连接(这个没什么好说的):                    

/**
* Project Name:uploadtest
* File Name:GetConnection.java
* Package Name:com.zsy.test
* Date:2016-4-23下午10:04:47
* Copyright (c) 2016, syzhao@zsy.com All Rights Reserved.
*
*/

package com.zsy.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class GetConnection
{
    /**
     * getConnection:(获取数据库连接). <br/>
     * @author syzhao
     * @return
     * @since JDK 1.6
     */
    public static Connection getConnection()
    {
        String driver = "oracle.jdbc.driver.OracleDriver";
        String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
        String username = "scott";
        String password = "123456";
        Connection conn = null;
        try
        {
            //classLoader,加载对应驱动
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        return conn;
    }
}

第二步:

     读取再到上传到数据库

       

/**
* Project Name:uploadtest
* File Name:UpLoadPhoto.java
* Package Name:com.zsy.test
* Date:2016-4-23下午10:20:22
* Copyright (c) 2016, syzhao@zsy.com All Rights Reserved.
*
*/

package com.zsy.test;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UpLoadPhoto
{
    /**
     * UpLoad:(上传到数据库). <br/>
     * @author syzhao
     * @param path 文件路径
     * @since JDK 1.6
     */
    public static void UpLoad(String path)
    {
        Connection connection = GetConnection.getConnection();
        insertPhoto(path, connection);
    }
    
    /**
     * insertPhoto:(向数据库插入图片). <br/>
     * @author syzhao
     * @param path 图片文件夹
     * @param connection 连接对象
     * @since JDK 1.6
     */
    private static void insertPhoto(String path, Connection connection)
    {
        File file = new File(path);
        //获取该path下的所有的文件
        String[] photoName = file.list();
        
        PreparedStatement pstmt = null;
        
        int num = 0;
        
        try
        {
            String sql =
                "insert into test_table (id,soureid,souretype,filename,filesize,content,UPDATETIME,state) values(?,?,?,?,?,?,sysdate,1)";
            pstmt = connection.prepareStatement(sql);
            String fileName = "";
            String pn = "";
            for (int i = 0; i < photoName.length; i++)
            {
                pn = photoName[i];
                //获取文件名,不加格式
                fileName = getFileName(pn);
                //取出具体的图片文件
                File file2 = new File(path + "\\" + pn);
                //读取图片
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file2));
                //设置主键
                pstmt.setLong(1, i + 1);
                //获取文件名
                pstmt.setString(2, fileName);
                //设置来源
                pstmt.setString(3, "1");
                //文件名+格式
                pstmt.setString(4, pn);
                //大小
                pstmt.setLong(5, file2.length());
                //设置图片内容  特别说明 连接驱动版本低只是实现了int类型的参数,但是file2.length()是返回long型的,如何你的文件比较大,请更新最新的数据库驱动
                pstmt.setBinaryStream(6, bis, (int)file2.length());
                System.out.println("上传成功!");
                num += pstmt.executeUpdate();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (pstmt != null)
                {
                    pstmt.close();
                }
                if (connection != null)
                {
                    connection.close();
                }
                
            }
            catch (SQLException e)
            {
                e.printStackTrace();
                
            }
        }
        
        System.out.println("成功上传:" + num + "张图片");
    }
    
    /**
     * getFileName:(获取文件名,根据条件获取). <br/>
     * @author 赵守云 syzhao@zsy
     * @param pn
     * @return 文件名
     * @since JDK 1.6
     */
    public static String getFileName(String pn)
    {
        String fileName = "";
        //照片名包含括号的,已括号分隔,,例如 123(张三).jpg  截取后取的值是123
        if (pn.contains("("))
        {
            fileName = pn.split("(")[0];
        }
        //照片名   例如 123.jpg  截取后取的值是123
        else if (pn.contains(".jpg"))
        {
            fileName = pn.split(".jpg")[0];
        }
        //照片名   例如 123.JPG  截取后取的值是123
        else if (pn.contains(".JPG"))
        {
            fileName = pn.split(".JPG")[0];
        }
        //如果以上不符合    默认 取值为 照片名+格式    例如:123.png
        else
        {
            fileName = pn;
        }
        
        return fileName;
    }
}

应该看到了这句了

  pstmt.setBinaryStream(6, bis, (int)file2.length());


//这个在数据库驱动版本比较低的时候,并没有实现pstmt.setBinaryStream(6, bis, Long);//这个方法,因为file.length()返回的就是long型的,不转换会报错,如果你上传的文件//比较大,建议搞最新版版本的数据库连接驱动,新版本已经实现了,我这里图片文件比较小,就直接转换成int型了,其他就没什//么了,至于你怎么保存,根据你的业务来就行了 ,,当然你也可以写一个界面来上传,,,

 
第三部:测试:
<pre name="code" class="java">/**
* Project Name:uploadtest
* File Name:Main.java
* Package Name:com.zsy.test
* Date:2016-4-23下午10:01:36
* Copyright (c) 2016, syzhao@zsy.com All Rights Reserved.
*
*/

package com.zsy.test;

public class Main
{
    
    /**
     * main:(这里用一句话描述这个方法的作用). <br/>
     * @author syzhao
     * @param args
     * @since JDK 1.6
     */
    public static void main(String[] args)
    {
        long startTime = System.currentTimeMillis();
        System.out.println("--------------------------计时开始----------------------------");
        UpLoadPhoto.UpLoad("C:\\Users\\Administrator\\Desktop\\需求\\照片");
        long endTime = System.currentTimeMillis();
        System.out.println("--------------------上传时间为:" + (endTime - startTime) / 1000 + " 秒-----------------");
        
    }
}
</pre><pre code_snippet_id="1659854" snippet_file_name="blog_20160424_7_690508" name="code" class="java">
 


//结果:

批量把文件(图片)导入到数据库