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

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

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

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


想法很简单:

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

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

          第一步:

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

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

package com.zsy.test;

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

public class GetConnection
{
    /**
     * getConnection:(获取数据库连接). 
* @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, [email protected] 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:(上传到数据库). 
* @author syzhao * @param path 文件路径 * @since JDK 1.6 */ public static void UpLoad(String path) { Connection connection = GetConnection.getConnection(); insertPhoto(path, connection); } /** * insertPhoto:(向数据库插入图片).
* @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:(获取文件名,根据条件获取).
* @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型了,其他就没什//么了,至于你怎么保存,根据你的业务来就行了 ,,当然你也可以写一个界面来上传,,,


第三部:测试:
/**
* Project Name:uploadtest
* File Name:Main.java
* Package Name:com.zsy.test
* Date:2016-4-23下午10:01:36
* Copyright (c) 2016, [email protected] All Rights Reserved.
*
*/

package com.zsy.test;

public class Main
{
    
    /**
     * main:(这里用一句话描述这个方法的作用). 
* @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 + " 秒-----------------"); } }



//结果:

批量把文件(图片)导入到数据库_第1张图片










你可能感兴趣的:(java,SQL)