java文件上传到sqlserver数据库的问题

YO_OY 发布于 2012/08/01 14:13
阅读 2K+
收藏 0
最近在研究文件上传到数据库的功能,我用的是内存流法,就是将二进制数据直接存储在数据库中但是我在读取的时候出现了问题,将数据读出并创建文件的时候,新创建的文件里只有类似  [B@84abc9   的数据,这个是为什么呢?我的文件大小为65,但是读取的时候只有9个字节,请求高人的指点,郁闷中...

以下是问题补充:

@YO_OY:sqlserver中给存储文件的字段设置的类型是varbinary(max)类型的 (2012/08/01 14:25)
加载中
0
红薯
红薯
你的代码写错了,贴出来看看吧
YO_OY
YO_OY
老师,我把代码贴下边了...帮忙看看吧...谢谢你了
0
开源中国董事会主席
开源中国董事会主席
晕 再晕 还得晕 把文件保存到数据库中
0
YO_OY
YO_OY
用户需求,没办法,又研究不出来,大侠们救命呀......不胜感激
 public static void main(String args[]) {
byte a[] = null;// **将测试文件test.doc读入此字节数组
File file1 = new File("D:/test.txt");
File file2 = new File("D:/aa.txt");// 从blob读出的信息写入该文件,和源文件进行对比测试
PDMDataBase db = new PDMDataBase();
try {
FileInputStream fin = new FileInputStream(file1);
FileOutputStream fout = new FileOutputStream(file2);
int flen = (int) file1.length();// 读入文件的字节长度
System.out.println("file length:" + flen);
a = new byte[flen];
int i = 0;
int itotal = 0;
// 将文件读入字节数组
for (; itotal < flen; itotal = i + itotal) {
i = fin.read(a, itotal, flen - itotal);
}
fin.close();
System.out.println("read itotal:" + itotal);
String strSQL = null;
// 初始化数据库的blob一定要用empty_blob()初始化
strSQL = "insert into UploadFiles(id,[content])" + "values('11',0)";
db.ExecuteSQL(strSQL);
// 插入其它数据后,定位BLOB字段
strSQL = "select [content] from UploadFiles where id='11'";
ResultSet rs = db.ExecuteQuerySQL(strSQL);
if (rs.next()) {
Blob blob = rs.getBlob("content");// 得到blob字段
int j = blob.setBytes(1, a);// 将字节数组写入字段
strSQL = "update UploadFiles set content =(convert(varbinary(800),'"
+ a + "'))" + " where id='11'";
db.ExecuteSQL(strSQL);
System.out.println("j:" + j);
}
System.out.println("insert into ok");
byte b[] = null;// 保存从blob读出的字节
strSQL = "select [content] from UploadFiles where id='11'";
rs = db.ExecuteQuerySQL(strSQL);
if (rs.next()) {
Blob blob2 = rs.getBlob("content");
System.out.println("blob2 length:" + blob2.length());
b = blob2.getBytes(1, flen);// 从blob取出字节流数据
System.out.println("b length:" + b.length);
}
// 将从blob读出的字节写入文件
fout.write(b, 0, b.length);
fout.close();
System.out.println("write itotal:" + b.length);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} 
YO_OY
YO_OY
今天突然发现,是不是Blob这个东西是不是只有Oracle数据库会用的东西啊,如果我的数据库是sqlserver的话,用这个是不是就不对呀?希望大家原谅,本人从来没接触过要把二进制数据写到数据库中的示例,所以,直接从网上当了一篇,然后自己整理了一下就写成这样了...见谅
0
开源中国董事会主席
开源中国董事会主席

假设必须存在数据库中的话我会这么做:

  1. 读取图片内容;
  2. 将 base64(图片内容)后的字符串存在数据库中
0
周明瑞
周明瑞
读出来时?.toString()一下就可以了
0
YO_OY
YO_OY
我要实现的是要把数据库中的二进制数据解析完之后放到我创建的文件里去,可是我的放完之后是这样的
0
YO_OY
YO_OY

最新读取生成文件部分的代码:(麻烦大家帮忙看看呀,也请红薯老师给看看呀,这个问题纠结好长时间了,不知道为什么就是没办法成功的写到文件中去,写进去的只有 [B@84abc9  这种东西

String strSQL = "";

byte data[] = new byte[] {};

File file = null;

FileOutputStream fos = null;

InputStream in = null;

PDMDataBase db = new PDMDataBase();

ResultSet rs = null;

strSQL = "select * from UploadFiles where id ='10'";

rs = db.ExecuteQuerySQL(strSQL);

try {

while (rs.next()) {

file = new File("D:/" + rs.getString("filename"));

           data = rs.getBytes("files");

if (!file.exists()) {

file.createNewFile();// 如果文件不存在,创建

}

fos = new FileOutputStream(file);

int size = 0;

if (data.length > 0) {

fos.write(data, 0, data.length);

System.out.println("********************");//输出正常

} else {

while ((size = in.read(data)) != -1) {

fos.write(data, 0, size);

}

  in.close();

}

fos.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

YO_OY
YO_OY
这段代码执行完之后写入文件中的仍然是图中那种效果,请大家帮帮忙啊,@红薯老师,帮忙给看一下吧。。。感激感激感激......
0
如风随影
如风随影

你存错了,不应该int j = blob.setbytes(1,a),这里不应该存a,而是将a里面的字节码转成字符串再保存,取出来再转回去成byte[]

YO_OY
YO_OY
谢谢你的热心回答,你的回答中“而是将a里面的字节码转成字符串再保存,取出来再转回去成byte[]”我不是很明白,能说的具体点吗?如果能有代码示例就更好了。非常的感谢......
0
YO_OY
YO_OY

非常感谢各位的帮忙,我现在终于发现问题所在了,我做了一个测试,这个测试没有跟数据库关联,我先读取出文件,把我读取到的数据放到了byte[]数组中,然后,我直接进行的把读取数组然后读到文件中,这样是没有任何错误的,但是只要读取文件-->放到数据库--->读入文件,文件中就会读入一串这个[B@61de33

YO_OY
YO_OY
不过还没有解决,还是希望大家能帮忙解决一下,谢谢
0
YO_OY
YO_OY
解决了,谢谢大家的帮助
返回顶部
顶部