asp.Net(c#)sqlserverからバイナリピクチャへのアクセスを実現するコード

5281 ワード

次に、主な実現構想について説明します.
1、アクセス画像
(1)、画像ファイルをバイナリに変換してsql serverに直接保存する
 
  
//UploadHelper.cs
///
///
///

///
///
public static Byte[] SetImgToByte(string imgPath)
{
FileStream file = new FileStream(imgPath, FileMode.Open, FileAccess.Read);
Byte[] byteData = new Byte[file.Length];
file.Read(byteData, 0, byteData.Length);
file.Close();
return byteData;
}
///
///
///

public static bool SaveEmployeeImg2Db(Employee model, string path)
{
try
{
Byte[] imgBytes = SetImgToByte(path);
model.Photo = imgBytes;
bool flag=EmployeeService.SaveEmployeePhoto(model); //EmployeeService , ,
return flag;
}
catch (Exception ex)
{
throw ex;
}
}

(2)、ホームページに画像をアップロードする
 
  
///
///
///

///
///
protected void btnUpload_Click(object sender, EventArgs e)
{
string serverPath = Server.MapPath("~/images/");
if (this.fuPhoto.HasFile) //fuPhoto fileupload
{
string fileName = this.fuPhoto.PostedFile.FileName;
FileInfo fi = new FileInfo(fileName);
string mimeType = this.fuPhoto.PostedFile.ContentType.ToLower();
if (mimeType.IndexOf("image") < 0)
{
//(" ");
}
else if(fi.Length > 2* 1024 * 1024)
{
// 2M,
}
else
{
string saveFilePath = serverPath + DateTime.Now.ToString("yyyyMMddHHmmss") + fileName;
try
{
//
this.fuPhoto.PostedFile.SaveAs(saveFilePath);
//
Employee model = new Employee(int.Parse(id)); //id EmployeeId,
bool flag = UploadHelper.SaveEmployeeImg2Db(model, saveFilePath);
}
catch
{
//(" ");
}
finally
{
//
if (System.IO.File.Exists(saveFilePath))
{
System.IO.File.Delete(saveFilePath);
}
}
}
}
else
{
//(" ");
}
}

(3)、データベースから写真を取り出す(フォーマットImageに戻る)
 
  
//UploadHelper.cs
///
/// Image
///

///
///
public static System.Drawing.Image GetImgFromByte(Employee model)
{
System.Drawing.Image img = null;
try
{
Stream stream = new MemoryStream(model.Photo);
img = System.Drawing.Image.FromStream(stream,false);
}
catch
{
img = null;
}
return img;
}

上記の方法を取り出した後、winformの下でPictureBoxのImage属性に直接値を付与すればよい.しかし、webの下にはこのような強力なコントロールがないので、次の手順があります.
2、直接ウェブページの中で流れの形式で画像を表示する
(1)、ピクチャフローページの生成(ImgHelper.aspx)
このページのデザインページは何もありません.クラスファイルは以下の通りです.
 
  
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.IO;
///
///
///

public partial class ImgHelper : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request["employeeId"])) // id
{
int employeeId = int.Parse(Request["employeeId"]);
Employee model = //EmployeeService.GetEmployeeByCondition(new Employee(employeeId))[0] as Employee; //
try
{
Byte[] byteImg = model.Photo;
Stream stream = new MemoryStream(byteImg);
System.Drawing.Bitmap img =(System.Drawing.Bitmap) System.Drawing.Bitmap.FromStream(stream, false); // Bitmap
Response.Buffer = false;
Response.ContentType = "image/jpg";
Response.AddHeader("Content-Disposition", "attachment;filename=photo.jpg");// photo.jpg
Response.BinaryWrite(byteImg);//
Response.End();
}
catch
{
Response.End();
}
}
}
}

(2)、写真を表示するページはImgHelperを呼び出す.aspx
ページをロードするときに、画像コントロールに次の値を割り当てます.
 
  
this.imgPhoto.ImageUrl = "/ImgHelper.aspx?employeeId="+tmpEmployee.Id.ToString(); //imgPhoto

全体的に、保存するとwinformに便利ですが、webformについては、少し変換する考えが必要です.牛の人がwinformの下のようにImageオブジェクトを直接バインドするコントロールを書くともっといいです.上のコードテストに合格しました.助けてほしいです.