首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么将图片录入到数据库中

2012-02-02 
如何将图片录入到数据库中?现,正在构建一数据录入界面使用vs2005C#中文版+SQLServer2000中文版winxp平台。

如何将图片录入到数据库中?
现,正在构建一数据录入界面使用vs2005   C#中文版+SQLServer2000中文版   winxp平台。

要求:将图片录入到数据库中,数据库中相应的存储图片字段数据类型为:Image

不知道在C#中,使用哪种控件可以将图片录入到数据库中。具体的原理请说说。谢谢

[解决办法]
<%@ WebHandler Language= "C# " Class= "Handler " %>

using System;
using System.IO;
using System.Web;

public class Handler : IHttpHandler {

public bool IsReusable {
get {
return true;
}
}

public void ProcessRequest (HttpContext context) {
// 设置响应设置
context.Response.ContentType = "image/jpeg ";
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.BufferOutput = false;
// 设置 Size 参数
PhotoSize size;
switch (context.Request.QueryString[ "Size "]) {
case "S ":
size = PhotoSize.Small;
break;
case "M ":
size = PhotoSize.Medium;
break;
case "L ":
size = PhotoSize.Large;
break;
default:
size = PhotoSize.Original;
break;
}
// 设置 PhotoID 参数
Int32 id = -1;
Stream stream = null;
if (context.Request.QueryString[ "PhotoID "] != null && context.Request.QueryString[ "PhotoID "] != " ") {
id = Convert.ToInt32(context.Request.QueryString[ "PhotoID "]);
stream = PhotoManager.GetPhoto(id, size);
} else {
id = Convert.ToInt32(context.Request.QueryString[ "AlbumID "]);
stream = PhotoManager.GetFirstPhoto(id, size);
}
// 从数据库获取照片,如果未返回照片,将获取默认的“placeholder”照片
if (stream == null) stream = PhotoManager.GetPhoto(size);
// 将图像流写入响应流中
const int buffersize = 1024 * 16;
byte[] buffer = new byte[buffersize];
int count = stream.Read(buffer, 0, buffersize);
while (count > 0) {
context.Response.OutputStream.Write(buffer, 0, count);
count = stream.Read(buffer, 0, buffersize);
}
}

}
[解决办法]
存图片代码:
FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
imagebytes = br.ReadBytes(Convert.ToInt32(fs.Length));
fs.Close();

cmd.Parameters.Add( "@studentPhoto ", SqlDbType.Image).Value = imagebytes;

读取图片代码:
// 显示图片
if(myReader[ "studentPhoto "].ToString() != " ")// 如果图片字段不为空时显示图片数据
{
imagebytes = (byte[]) (myReader[ "studentPhoto "]);
studentAbout.Text = myReader[ "studentAbout "].ToString(); // 预先显示一下附注信息,免得数据库图片字段有值,但不是图片时产生异常而不执行下面的内容。
if (imagebytes.Length > 0)
{
MemoryStream stream = new MemoryStream(imagebytes, true); // 创建一个内存流,支持写入,用于存放图片二进制数据
try
{
stream.Write(imagebytes, 0, imagebytes.Length);
Bitmap FinalImage = new Bitmap(stream);
this.studentPhoto.Image = FinalImage;
this.studentPhoto.Refresh();
}
finally
{
stream.Close();
}
}
}

[解决办法]
点击一个Button,将选中的图片上传到数据库中:

protected void updateButton_Click(object sender, EventArgs e)
{

SqlConnection conn = SqlBD.Opened_connnection(connStrLabel.Text);//创建连接

//获取上传图片的参数
string filename = Path.GetFileName(chooseFile.PostedFile.FileName);
string filepath = Server.MapPath( "~\\临时文件夹\\ " + filename);


int imgdatalen = chooseFile.PostedFile.ContentLength;
string imgtype = chooseFile.PostedFile.ContentType;
byte[] imgdata = new byte[imgdatalen];

//保存图片到服务器指定文件夹
chooseFile.PostedFile.SaveAs(filepath);

//获取上传图片的数据流
Stream imgdatastream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
int n = imgdatastream.Read(imgdata, 0, imgdatalen);

try
{
//设定执行插入命令的参数
SqlCommand comm = new SqlCommand( "insert into net_picture_tab (picture_code,picture_name,picture_type_id,Create_time,Is_in_use,picture_format,Content,remark) " +
" values ( ' " + picture_codeTextBox.Text + " ', ' " + picture_nameTextBox.Text + " ', ' " + picture_typeDropDownList.SelectedItem.Value + " ', ' " + DateTime.Now.ToString() + " ',0,@imgtype,@imgdata, ' " + remarkTextBox.Text + " ') ", conn);

//设置图片内容参数
SqlParameter paramData = new SqlParameter( "@imgdata ", SqlDbType.Image);
paramData.Value = imgdata;
comm.Parameters.Add(paramData);

//设置图片格式参数
SqlParameter paramType = new SqlParameter( "@imgtype ", SqlDbType.VarChar, 50);
paramType.Value = imgtype;
comm.Parameters.Add(paramType);

//执行插入
int numRowsAffected = comm.ExecuteNonQuery();

}
catch (Exception ee)
{
SqlBD.MessageBox(this.Page, "上传图片出错: " + ee.Message);
return;
}
finally
{
conn.Close();
}
SqlBD.MessageBox(this.Page, "上传图片成功! ");

//删除保存在服务器临时文件夹中的图片
imgdatastream.Close();
System.IO.File.Delete(filepath);

}
[解决办法]
#region 文件上传
/// <summary>
/// 文件上传
/// </summary>
/// <returns> </returns>
public bool FileUp()
{
int k = FileUploadImag.PostedFile.FileName.LastIndexOf( ". ");// 取得文件名(抱括路径)里最后一个 ". "的索引
string sEnlargeName = (FileUploadImag.PostedFile.FileName.Substring(k)).ToLower();// 取得文件扩展名,并转换为小写
if (sEnlargeName != ".jpg " & sEnlargeName != ".jpeg " & sEnlargeName != ".gif " & sEnlargeName != ".bmp " & sEnlargeName != ".png ")
{
PComm.Comm.Show(this.Page, "图片的格式只可以是以下几种:jpg、jpeg、bmp、png、gif! ");
return false;
}
else
{
// 原理:用户上传文件到服务器时,因为在服务器的目录下可能已存在相同文件名的文件,此时直接保存的话,后者就会覆盖前者
// 所以,在保存之前,首先要将上传的文件重新命名,命名的规则是:当前时间+一位随机数+后缀。
// 然后,在数据库的文件表(File)中新增一条新的记录,记录该文件的ID、后缀、原文件名、现文件名、路径等。
// 文件在系统中的操作,是通过文件ID来实现的。
int MaxSizeM = 100;
long lFileSize = MaxSizeM * 1024 * 1024;// 上传文件最大M数 转为字节数
long sSize = FileUploadImag.PostedFile.ContentLength;// 取得文件的大小

if (FileUploadImag == null) return false;

if (FileUploadImag.PostedFile.FileName == " " || sSize <= 0)// 上传文件不为空
{
PComm.Comm.Show(this.Page, "您还没有指定要上传的文件! ");


return false;
}

if (sSize > = lFileSize && MaxSizeM != 0)//MaxSizeM=0 则不限制上传文件的大小
{
PComm.Comm.Show(this.Page, "文件太大,请确保文件小于 " + System.Convert.ToString(MaxSizeM) + "M ' ");
return false;
}

try
{
FileOrginName = FileUploadImag.PostedFile.FileName.Substring(FileUploadImag.PostedFile.FileName.LastIndexOf( "\\ ") + 1);
int i = FileUploadImag.PostedFile.FileName.LastIndexOf( ". ");// 取得文件名(抱括路径)里最后一个 ". "的索引
string sEnlargeName1 = FileUploadImag.PostedFile.FileName.Substring(i);// 取得文件扩展名,并转换为小写
sEnlargeName1 = sEnlargeName1.ToLower(); // 文件扩展名

string sNewName;
Random rnd = new Random();// 用上传文件时的系统时间+一位随机数为文件重新命名。
int j = rnd.Next(0, 9);// 随机数
sNewName = DateTime.Now.Year.ToString();
sNewName = sNewName + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString();
sNewName = sNewName + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString();
sNewName = sNewName + DateTime.Now.Second.ToString() + j.ToString();


FileName = sNewName + sEnlargeName1;//文件名称
FileType = sEnlargeName1;//文件类型
Path = "LoadFile/bigImages ";//源图片路径
oPath = "LoadFile/somallImages ";//略缩图路径
string sSavePath = Page.Request.ServerVariables[ "APPL_PHYSICAL_PATH "] + Path + "/ ";//源图片路径
FilePach = sSavePath + FileName;//文件路径
OutlinePath = Page.Request.ServerVariables[ "APPL_PHYSICAL_PATH "] + oPath + "/ ";
OutlinePath += FileName;
FileUploadImag.PostedFile.SaveAs(System.IO.Path.Combine(sSavePath, FileName));// 上传到服务器
MakeThumbnail(FilePach, OutlinePath, 200, 200, "Cut ");
return true;
}
catch
{
return false;
}
}
}
#endregion

#region 生成缩略图
/// <summary>
/// 生成缩略图
/// 在网站开发时,生成缩略图是一个非常常见和实用的功能.以前在asp里只能借助com组件实现,现在在.net里可以利用框架的强大的类库轻松实现.
/// </summary>
/// <param name= "originalImagePath "> 源图路径(服务器中的绝对路径,不是URL,含文件名,) </param>
/// <param name= "thumbnailPath "> 缩略图路径(服务器中的绝对路径,不是URL,含文件名,) </param>
/// <param name= "width "> 缩略图宽度 </param>
/// <param name= "height "> 缩略图高度 </param>
/// <param name= "mode "> 生成缩略图的方式 </param>
public void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
{
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);

int towidth = width;
int toheight = height;

int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;

switch (mode)
{
case "HW "://指定高宽缩放(可能变形)
break;
case "W "://指定宽,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H "://指定高,宽按比例
towidth = originalImage.Width * height / originalImage.Height;


break;
case "Cut "://指定高宽裁减(不变形)
if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
{
oh = originalImage.Height;
ow = originalImage.Height * towidth / toheight;
y = 0;
x = (originalImage.Width - ow) / 2;
}
else
{
ow = originalImage.Width;
oh = originalImage.Width * height / towidth;
x = 0;
y = (originalImage.Height - oh) / 2;
}
break;
default:
break;
}

//新建一个bmp图片
System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);

//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//清空画布并以透明背景色填充
g.Clear(Color.Transparent);

//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
new Rectangle(x, y, ow, oh),
GraphicsUnit.Pixel);

try
{
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
#endregion
[解决办法]
如果打算做的系统是准备长期用,而不是来做实验的,
建议将数据库中只存图片路径名,否则后期的维护会让你一个头n个大:
数据库备份太成问题了,因为图片一张两张不显得大,稍微多点就要命。

菜鸟我曾经参与的一个项目,数据库用了不到半年,有11GB+,而图片战了绝大部分空间

[解决办法]
图片存入数据库

FileStream fs = File.OpenRead( "E:\\study\\pic1.jpg ");
byte[] fb = new byte[fs.Length];
fs.Read(fb, 0, (int)fs.Length);
string strSql = "INSERT INTO tb1_test(ID,Name,pic) VALUES(4, 'zhengce ',@file) "; //sql语句,其中保存图片的pic字段为Image类型
string sConn = "Data Source=127.0.0.1;Initial Catalog=test;User ID=sa;Password=sa ";//连接字符串
SqlConnection myConn;
SqlCommand myCom;
myConn = new SqlConnection(sConn);
try
{
myConn.Open();
myCom = new SqlCommand(strSql, myConn);
myCom.Parameters.Add( "@file ", SqlDbType.Image);
myCom.Parameters[ "@file "].Value = fb;
myCom.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
myConn.Close();
}

热点排行