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