最近两天,阿堂在处理将页面中的文件上传和下载时,要将页面上,客户选择的任意类型上传的文件,写入到oracle中的BLOB类型的字段中,同时,客户也能下载上传的多个任意类型的文件,遇到了一些问题,也到网上查了不少资料,感觉网上的资料都或多或少有些错务,最后通过自己的反复测试总算解决了,解决的过程中,还真有不少收获,这里还是写下来,和朋友们分享一下!
以下是本人的几点总结,当然,上面的两个方法(上传和下载)中,本身已经加了注解了
1.个人感觉对于mysql中blob类型的字段,sql
server中的image类型的字段,oracle中的blob类型的字段读写操作的方式是有区别的,既有相同点,也有不同点
2.mysql中的BLOB类型字段的读写,sql
server中image类型的字段读写,oracle中的BLOB类型的字段的读写的比较(写对应的上传文件,读对应的下载文件)
对于mysql中的blob类型的字段和sql
server中的image字段类型的写(文件上传),在插入insert操作时,
用pst.setBinaryStream(1, fis,
int(f.length()))这种类似的写法,基本上就可以将数据插入到其BLOB类型的字段中去了。
对于mysql中的blob类型的字段和sql
server中image字段的读(文件下载)
mysql中 用 BLOB
orderfile=rs.getBlob("order");得到输入流,再用输出流输出这些二进制就可以下载文件
sqlserver中用rs.getBinaryStream("orderfile");得到输入流,再用输出流输出这些二进制就可以下载文件
对于oracle中的写(上传文件)
第一步 先向BLOB字段中先插入一个空的BLOB值,用EMPTY_BLOB()
如 insert into Webfiles(PATH,FILENAME,USERNAME,JOB_NO,ORDERFILE)
values(?,?,?,?,EMPTY_BLOB())
第二步再用select ...for update这种形式的语句来更新数据库中blob字段对应的值
如 select orderfile from Webfiles where Webfiles.job_no=? and
Webfiles.filename=? for update
(更多细节请参照我上面贴的我项目中的源代码)
对于oracle中的读(下载文件)
第一步。得到数据库中的BLOB类型的字段
oracle.sql.BLOB blob =
(oracle.sql.BLOB)rs.getBlob("orderfile");
第二步。将blob作为输入流,再通过输出流输出即可
in = new
BufferedInputStream(blob.getBinaryStream());
byte[] buf = new byte[1024];
int hasRead=0;
while((hasRead=in.read(buf))>0)
{
sos.write(buf, 0, hasRead);
}



//上传文件
public synchronized boolean
insert_Wfiles(WebfilesBean wb) throws IOException,
SQLException
{
boolean flag=false;
//得到文件输入流
String filePath = wb.getPath()
+ "\\" + wb.getFilename();
File f = new
File(filePath);
InputStream fis = new
FileInputStream(f);
//定义输入流和输出流
BufferedOutputStream
out=null;
BufferedInputStream in=null
;
//插入一个空的Blob值
String str1 = "insert into
Webfiles(PATH,FILENAME,USERNAME,JOB_NO,ORDERFILE)
values(?,?,?,?,EMPTY_BLOB())";
ResultSet rs=null;
PreparedStatement pst =
null;
try {
// 这里一定要手工设置控制事务
conn.setAutoCommit(false);
pst =
conn.prepareStatement(str1);
pst.setString(1,ConvertString.converString1(filePath));
pst.setString(2,
ConvertString.converString1(wb.getFilename()));
pst.setString(3,
ConvertString.converString1(wb.getUsername()));
pst.setString(4,
wb.getJobno());
pst.executeUpdate();
String
str2="select orderfile from Webfiles where Webfiles.job_no=? and
Webfiles.filename=? for update";
pst=conn.prepareStatement(str2);
pst.setString(1,
wb.getJobno());
pst.setString(2,
wb.getFilename());
rs=pst.executeQuery();
while
(rs.next())
{
oracle.sql.BLOB
blob =
(oracle.sql.BLOB)rs.getBlob("orderfile");
out
= new BufferedOutputStream(blob.getBinaryOutputStream());
in
= new BufferedInputStream(fis);
int
c;
//将实际文件中的内容以二进制的形式来输出到BLOB对象对应的输出流中
while
((c=in.read())!=-1)
{
out.write(c);
}
in.close();
out.close();
}
conn.commit();
if
(f.exists())
f.delete();
flag=true;
return
flag;
} catch (SQLException e)
{
conn.rollback();
e.printStackTrace();
System.out.println("插入数据不成功");
return
false;
} finally {
pst.close();
fis.close();
}
}
//下载文件
public void getdownFile1(String
jobno,String filename,ServletOutputStream sos) throws
Exception
{