通常对用户上传的图片需要保存到数据库中。解决方法一般有两种:一种是将图片保存的路径存储到数据库;另一种是将图片以二进制数据流的形式直接写入数据库字段中。以下为具体方法:
一、保存图片的上传路径到数据库:
string uppath=”“;//用于保存图片上传路径
//获取上传图片的文件名
string fileFullname = this.FileUpload1.FileName;
//获取图片上传的时间,以时间作为图片的名字可以防止图片重名
string dataName = DateTime.Now.ToString(“yyyyMMddhhmmss”);
//获取图片的文件名(不含扩展名)
string fileName = fileFullname.Substring(fileFullname.LastIndexOf(“\”) + 1);
//获取图片扩展名
string type = fileFullname.Substring(fileFullname.LastIndexOf(“.”) + 1);
//判断是否为要求的格式
if (type == “bmp” || type == “jpg” || type == “jpeg” || type == “gif” || type == “JPG” || type == “JPEG” || type == “BMP” || type == “GIF”)
{
//将图片上传到指定路径的文件夹
this.FileUpload1.SaveAs(Server.MapPath(“~/upload”) + “\” + dataName + “.” + type);
//将路径保存到变量,将该变量的值保存到数据库相应字段即可
uppath = “~/upload/” + dataName + “.” + type;
}
二、将图片以二进制数据流直接保存到数据库:
引用如下命名空间:
using System.Drawing;
using System.IO;
using System.Data.SqlClient;
设计数据库时,表中相应的字段类型为iamge
保存:
//图片路径
string strPath = this.FileUpload1.PostedFile.FileName.ToString ();
//读取图片
FileStream fs = new System.IO.FileStream(strPath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] photo = br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
//存入
SqlConnection myConn = new SqlConnection(“Data Source=.;Initial Catalog=stumanage;User ID=sa;Password=123”);
string strComm = ” INSERT INTO stuInfo(stuid,stuimage) VALUES(107,@photoBinary )”;//操作数据库语句根据需要修改
SqlCommand myComm = new SqlCommand(strComm, myConn);
myComm.Parameters.Add(“@photoBinary”, SqlDbType.Binary, photo.Length);
myComm.Parameters[“@photoBinary”].Value = photo;
myConn.Open();
if (myComm.ExecuteNonQuery() > 0)
{
this.Label1.Text = “ok”;
}
myConn.Close();
读取:
…连接数据库字符串省略
mycon.Open();
SqlCommand command = new
SqlCommand(“select stuimage from stuInfo where stuid=107”, mycon);//查询语句根据需要修改
byte[] image = (byte[])command.ExecuteScalar ();
//指定从数据库读取出来的图片的保存路径及名字
string strPath = “~/Upload/zhangsan.JPG”;
string strPhotoPath = Server.MapPath(strPath);
//按上面的路径与名字保存图片文件
BinaryWriter bw = new BinaryWriter(File.Open(strPhotoPath,FileMode.OpenOrCreate));
bw.Write(image);
bw.Close();
//显示图片
this.Image1.ImageUrl = strPath;
采用俩种方式可以根据实际需求灵活选择。
将图片文件写入数据库BLOB 此博文包含图片 (2016-02-01 21:10:34)转载▼
标签: 杂谈 分类: 信息技术
http://www.blogjava.net/tunaic/archive/2009/05/18/271317.html
Posted on 2009-05-18 13:51 三羽 阅读(1367) 评论(0) 编辑 收藏 所属分类: JAVA资料 将图片文件写入数据库BLOB
import java.sql.*;
import oracle.sql.*;
import java.io.*;
import oracle.jdbc.driver.OracleResultSet;
public class WriteBlob {
public static void main(String[] args) {
try {
// 连接数据库
//Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
//Connection conn = DriverManager.getConnection(“jdbc:odbc:Yzl”,”pda”,”pwpda”);
Class.forName(“oracle.jdbc.driver.OracleDriver”);
Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:SISSI”,”pda”,”pwpda”);
conn.setAutoCommit(false);
// 获取源照片数据
BLOB blob = null;
Blob blob2 = null;
String fileName = “c:\01.jpg”;
File f = new File(fileName);
// 先插入一条记录,用于后面获得一个Blob对象
PreparedStatement pstmt = conn.prepareStatement(“insert into javatest(PICNAME,content) values(?,empty_blob())”);
pstmt.setString(1,”Yzl”);
pstmt.executeUpdate();
pstmt.close();
// 获得Blob对象(由于Blob是接口,不能实例化,所以只好用这种曲折方法获得)
pstmt = conn.prepareStatement(“SELECT content FROM JAVATEST WHERE trim(PICNAME)=? “);
pstmt.setString(1,”Yzl”);
ResultSet rset = pstmt.executeQuery();
if (rset.next()) blob = (BLOB)rset.getBlob(1);
pstmt.close();
if (blob == null){
System.out.println(“blob is null”);
conn.close();
return ;
}
// 填充Blob值,用于提交到数据库
FileInputStream fin = new FileInputStream(f);
System.out.println(“file size = ” + fin.available());
OutputStream out = blob.getBinaryOutputStream();
byte[] data = new byte[(int)fin.available()];
// 获取
fin.read(data);
out.write(data);
// 关闭资源
fin.close();
out.close();
// 插入数据库
pstmt = conn.prepareStatement(“update javatest set content=? where PICNAME=?”);
pstmt.setBlob(1,blob);
pstmt.setString(2,”Yzl”);
pstmt.executeUpdate();
pstmt.close();
// 提交
conn.commit();
// 获取数据库中的照片
pstmt = conn.prepareStatement(“SELECT content FROM JAVATEST WHERE trim(PICNAME)=? “);
pstmt.setString(1,”Yzl”);
rset = pstmt.executeQuery();
if (rset.next()) blob = (BLOB)((OracleResultSet)rset).getBLOB(1);
pstmt.close();
if (blob == null){
System.out.println(“blob2 is null”);
conn.close();
return ;
}
// 输出到磁盘
// 获得
FileOutputStream fout = new FileOutputStream(new File(“c:\02.jpg”));
InputStream in = blob.asciiStreamValue();
data = new byte[(int)in.available()];
System.out.println(“数据库中照片的字节数:”+in.available()); // 此句总是为 0 不知道为什么,有谁知道吗?
// 输出
in.read(data);
fout.write(data);
// 关闭资源
fin.close();
out.close();
conn.close();
// 打开
//Process pro = Runtime.getRuntime().exec(“cmd /c start c:\02.jpg”);
} catch (SQLException e) {
System.err.println(e.getMessage());
e.printStackTrace();
} catch (IOException e) {
System.err.println(e.getMessage());
} catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}