سلام.
من مي خوام با detailsview اطلاعات رو به همراه عكس در ديتا بيس ذخيره كنم و تو gridview نمايش بدم.حالا احتياج به يك دكمه browse دارم كه براي ذخيره يك عكس جديد يا ويرايشش لازم دارم.بلد نيستم چي كار كنم.ضمنا سرچ هم كردم.
Printable View
سلام.
من مي خوام با detailsview اطلاعات رو به همراه عكس در ديتا بيس ذخيره كنم و تو gridview نمايش بدم.حالا احتياج به يك دكمه browse دارم كه براي ذخيره يك عكس جديد يا ويرايشش لازم دارم.بلد نيستم چي كار كنم.ضمنا سرچ هم كردم.
یه چیز کلی بگم اول اگر تعداد و حجم عکس ها زیاده پیشنهاد میکنم عکس رو تو دیتا بیس ذخیره نکنی .
ولی برای اپلود عکس در دیتا بیس در web از کنترل FileUpload استفاده کن تو ویندوز app از FileDialog . یه ستون از نوع Binary یا Varbinary تو دیتا بیس بساز عکس رو اونتو ذخیره کن بد نیست حجم عکس رو هم ذخیره کنی اگر Mime های مختلف داری نوع عکس رو هم ذخیره کن (تو قسمت ذخیره اگر مشکلی داری بگو تا بیشتر توضیح بدم) .
برای خوندن اطلاعات عکس هم بهتره از DataReader استفاده کنی فقط نکتش اینه که وقتی با DataReader اطلاعات از نوع Binary رو میخونی باید همونجا اونو به Byte تبدیل کنی با TryCast میتونی این کار رو بکینی بعد Header و نوع و حجم رو به عکس اضافه کن .
این خلاصش بود .
سلام
بهتره شما فایل رو آپلود کنید و فقط ادرس عکس رو تو بانک ذخیره کنید . . .
سلام .ممنون ، ولي خلاصه نگيد .من تازه به جمع تازه كارها وارد شدم.تقريبا تو آپلود مشكلي ندارم(فكر كنم).مشكل اينه كه براي ذخيره كردن عكس يك دكمه browse ميخوام كه عكسمو اول پيدا كنم و بعد آدرس عكسو ذخيره كنم.(نمي دونم خوب مفهوم سئوالمو رسوندم يا نه )حالا اين دكمه رو نمي دونم چجوري تو detailsview بذارم .
سلام.
من از خير detailsview گذشتم،چون به نتيجه نرسيد.حالا به صورت معمولي مي خوام يك عكس رو در ديتابيس ذخيره كنم.براي ذخيره هم از اين توابع استفاده كردم.
فكر نكنم مشكلي داشته باشن.در آخر هم اطلاعات رو تو gridview نمايش دادم .حالا مشكل اينجاست كه تو ستون img_data به جاي تصوير [ ]System.Byte نشون مي ده.چرا؟کد:
private int SaveToDB(string imgName, byte[] imgBinaryData, string imgContentType)
{
//use the web.config to store the connection string
SqlCommand command = new SqlCommand("INSERT INTO Image (img_name,img_data,img_contenttype) VALUES ( @img_name, @img_data,@img_contenttype )", connection);
SqlConnection connection = new SqlConnection("server=localhost;database=databasename;password=mypassword;user id=userid");
SqlParameter param0 = new SqlParameter("@img_name", SqlDbType.VarChar, 50);
param0.Value = imgName;
command.Parameters.Add(param0);
SqlParameter param1 = new SqlParameter("@img_data", SqlDbType.VarBinary,50);
param1.Value = imgBinaryData;
command.Parameters.Add(param1);
SqlParameter param2 = new SqlParameter("@img_contenttype", SqlDbType.VarChar, 50);
param2.Value = imgContentType;
command.Parameters.Add(param2);
connection.Open();
int n = command.ExecuteNonQuery();
connection.Close();
return n;
}
protected void UploadBtn_Click(object sender, EventArgs e)
{
if (Page.IsValid) //save the image
{
int imgLen = UploadFile.PostedFile.ContentLength;
byte[] imgBinaryData = new byte[imgLen];
Stream imgStream = UploadFile.PostedFile.InputStream;
int n = imgStream.Read(imgBinaryData, 0, imgLen);
string imgContentType = UploadFile.PostedFile.ContentType;
string imgName = txtImgName.Value;
int RowsAffected = SaveToDB(imgName, imgBinaryData, imgContentType);
if (RowsAffected > 0)
{
Response.Write("<BR>The Image was saved");
}
else
{
Response.Write("<BR>An error occurred uploading the image");
}
}
خوب شما Binary ذخیره کردی Binary بر میگردونی , باید Binary رو داخل یه فایل بریزی و به Byte تبدیل کنی بعد اون فایل رو نمایش بدی .
بهترین راه اینه که یه صفحه درست کنی یا یک web handler اسمش رو بزاری مثلا Image بعد عکس رو تو اون صفحه Response کنی بعد به ادرس اون صفحه رو به عنوان عکس بفرستی .
سعی میکنم کدش رو برات بزارم .
لطفا كدش رو بذاريد.البته مثل اينكه با اين روش يعني به صورت باينري ذخيره كردن فقط پسوند bmp رو جواب ميده.
فکر کنم این نمونه بد نباشه
کد:Private Function LoadImage(ByVal keyfield As Integer) As System.Drawing.Image
Try
Using dbCon As New SqlConnection(Me.m_ConnectionString), dbCom As New SqlCommand("SELECT...", dbCon)
dbCon.Open()
Dim buffer() As Byte = TryCast(dbCom.ExecuteScalar, Byte())
dbCon.Close()
If buffer IsNot Nothing AndAlso buffer.Length > 0 Then
Using strm As New System.IO.MemoryStream(buffer)
Return System.Drawing.Image.FromStream(strm)
End Using
End If
End Using
Catch ex As Exception
End Try
Return Nothing
End Function
برای فراخونی:
LoadImage(CInt(id))
نه ربطی نداره هر پسوندی میشه من این کدهارو براتون آپلود کردم برای مجموعه های LearnVisualStusio.Net هست Insert و Read رو جفتش رو داشت البته فیلمم داره ولی حجمش خیلی زیاده نمیتونم آپلود کنم این کارتون رو راه میندازه . البته هنوزم توصیه میکنم اگر تو دیتا بیس ذخیره نکنین شاید بهتر باشه .نقل قول:
http://rapidshare.com/files/118245787/SqlBinaryData_CS.rar.html
براکت خان مثالتون رو نتونستم دانلود کنم رپید یکم دلپیچه گرفته !!
اما فکر کنم اون کدی که بالا نقل کردم ( از استاد h2 ) کار رو راه بندازه
همینطور شرمنده حواسم نبود که کد سی شارپ مورد نیازتونه گرچه فرقی نداره اما این هم نمونه #C
کد:private System.Drawing.Image LoadImage(int keyfield)
{
try {
using (SqlConnection dbCon = new SqlConnection(this.m_ConnectionString)SqlCommand dbCom = new SqlCommand("SELECT...", dbCon)) {
dbCon.Open();
byte[] buffer = dbCom.ExecuteScalar as byte[];
dbCon.Close();
if (buffer != null && buffer.Length > 0)
{
using (System.IO.MemoryStream strm = new System.IO.MemoryStream(buffer)) {
return System.Drawing.Image.FromStream(strm);
}
}
}
}
catch (Exception ex) {
}
return null;
}