您的位置:首页 > 数据库

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

2016-04-24 15:46 435 查看
客户给了几百张用户的照片,照片的名称格式是:护照号+格式。
本来打算直接放到服务器上的,但是考虑到以后的数据会越来越大,就打算存在数据库了。
就写了 一个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">


//结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: