PDA

View Full Version : مشاوره برای روش استاندار ذخیره عکس برای گالری



awwex2007
جمعه 08 بهمن 1389, 11:11 صبح
سلام دوستان .
من گالری نمونه پروژه های یک وب سایت رو که به صورت عکس هست رو می خوام طراحی کنم .حالا سوالی که برای من پیش اومده اینه که برای ذخیره عکس ها :
1-در بانک sql سایت ذخیره کنم
2-در خارج از بانک
کدام روش متداول تر و بهروه بری بیشتری داره و اصولاً از هر کدام در چه مواردی استفاده میشه؟
آیا روش ذخیره در دیتابیس با توجه به اینکه اغلب فایل ها حجم بین 500 کیلو تا 1 مگابایت دارن دیتابیس رو کند نمی کنه ؟
آیا روش دوم امنیت پایینی نداره؟(که البته در این مورد زیاد هم امنیت بالایی نیاز نیست).
ممنون میشم از تجربیات خودتون بهره مندم کنید.

Javad.Kashi
جمعه 08 بهمن 1389, 12:19 عصر
سلام دوست عزیز
با در نظر گرفتن تجربه دوستان و مشاوره اساتید ، شما می بایست که آدرس تصاویر را در دیتابیس ذخیره کنید نه خود تصاویر را . در عوض خود تصاویر را در هاست ذخیره کرده و هنگام نیاز به آنها ، با توجه به آدرس ذخیره شده در بانک آنها را فراخوانی می کنید.
البته : برای اینکه تصاویر با اسم های تکراری ذخیره نشوند(تا بعدا با مشکل روبه رو نشوی ) می بایست از اسامی رندمی استفاده کنی

مثال:


private void InsertForm()
{
string filename_relative = string.Empty;
string filename = string.Empty;
if (FileUploadImage.PostedFile != null)
{
string uploaded_file_extention = Path.GetExtension(FileUploadImage.PostedFile.FileN ame);
filename = Guid.NewGuid().ToString() + uploaded_file_extention;
filename_relative = "~/Uploads/Images/" + filename;
string file_path_to_save = Server.MapPath(filename_relative);

FileUploadImage.PostedFile.SaveAs(file_path_to_sav e);
}

InsertRow(
filename_relative,
);
}
همانطور که در مثال می بینید ، یک اسم رندمی برای عکس قرار داده و آن را(به همراه آدرس کامل) در دیتابیس ذخیره می کنیم.ففقط یادت نره که InsertRow() را خودم گذاشتم که متوجه بشی (یه وقت فکر نکنی که در خود برنامه این متد موجود است)
یا علی مدد

awwex2007
جمعه 08 بهمن 1389, 13:26 عصر
1-اگه لطف کنید و کد مربوط به asp رو بدید چون من با asp دارم کار می کنم و از php چیزی نمی دونم.
2-پس با این حساب باید عکس ها رو در پوشه های جدا طبقه بندی و در صورت نیاز فراخوانی کنم.
اگه ممکنه نمونه آماده ای بدید یا مثال عملی بزنید.!
با تشکر:قلب:

Javad.Kashi
جمعه 08 بهمن 1389, 15:26 عصر
سلام دوست عزیز

1. کدی که برای شما گذاشتم برای asp.net بوده که فقط در ادیتور php نمایش داده شده است ( به اون PHP که در بالای کد نمایش داده شده است ربطی ندارد)
2. asp classic با asp.net بسیار متفاوت می باشد.

تازه اگه خدا بخواد دارم یه مقاله برای مدیریت فایل های آپلودی می سازم . دعا کن هر چه سریعتر درستش کنم.

raziee
شنبه 09 بهمن 1389, 09:15 صبح
شما عکس رو در File System ذخیره که ، اما نه در هر کجا!!
تصاویر(به طور کلی فایل هایی که از نظر سطح دسترسی مهم هستند) رو در پوشه ی App_Data ذخیره کن.
IIS از دسترسی افراد به این پوشه جلوگیری میکنه.
برای نمایش هم از یک Handler استفاده کن و تصویر رو از پوشه مربوطه بخون و در خروجی بنویس.
این کار باعث میشه تا هم بتونی سطح دسترسی رو کنترل کنی.
هم اینکه در صورت نیاز عکس رو ReSizeکنی.

awwex2007
شنبه 09 بهمن 1389, 18:10 عصر
خوب اینی که شما گفتید رو به صورت یک پروژه عملی دارید ؟؟
یا میتونید مثال بزنید من زیاد با این مبحث آشنایی قبلی ندارم .

Alireza_Salehi
شنبه 09 بهمن 1389, 19:45 عصر
شما عکس رو در File System ذخیره که ، اما نه در هر کجا!!
تصاویر(به طور کلی فایل هایی که از نظر سطح دسترسی مهم هستند) رو در پوشه ی App_Data ذخیره کن.
IIS از دسترسی افراد به این پوشه جلوگیری میکنه.
برای نمایش هم از یک Handler استفاده کن و تصویر رو از پوشه مربوطه بخون و در خروجی بنویس.
این کار باعث میشه تا هم بتونی سطح دسترسی رو کنترل کنی.
هم اینکه در صورت نیاز عکس رو ReSizeکنی.
تصاویر را در هر پوشه ای می توان ذخیره کرد مشکلی در نمایش بوجود نمی آید. مثلا یک پوشه به نام gallery ایجاد کنید و عکسها رو اونجا ذخیره کنید.

استفاده از handler و تغییر سایز عکس سربار پردازشی زیادی بر روی سرور ایجاد می کند، با توجه به این که هزینه ارتقا پردازنده سرور به نسبت ارتقا هارددیسک ان بسیار گرانتر است، تغییر سایز عکس در هنگام ذخیره سازی (ذخیره سازی با تمام سایز های مورد نیاز) بسیار بهینه تر است و موجب هدر رفتن منابع AppPool نمی شود.


برای تعین سطح دسترسی می توان از روش های دیگری استفاده کرد.

awwex2007
یک شنبه 10 بهمن 1389, 15:59 عصر
خوب تا اینجا فقط به روش ذخیره عکس رسیدگی کردیم ، برای فراخوانی عکس های یک پوشه در یک کوئری می تونیم آدرس عکس های داخل یک پوشه رو داشته باشیم .اما چطوری و با چه ابزاری نمایش بدیم .
از gridview که نمیشه . با کنترل image هم که چون نمیدونیم چند تا فایل ممکنه تو یک پوشه باشه نمیشه .
البته اگر راه راحت تر ی وجود نداشته باشه به نظرم منطقی تر اینه که به طور مثال 10 تا کنترل image توی یک صفحه بذاریم و به تعداد فایل ها ، اگر بیش از 10 تا بود(مثلاً)اون رو صفحه بندی کنیم و وقتی روی صفحه بعد کلیک کرد 10تایی بعدی نمایش داده بشه.
روش دیگه ای که به ذهنم رسید اینه که کنترل image رو در زمان اجرای برنامه به نسبت تعداد فایل ها بسازیم مثلا اگر 15 تا فایل توی یک پوشه بود 15 تا imageبسازه و به هر کدم به ترتیب آدرس فایل ها رو نسبت بده.
لطف کنید بگید این راه ها درسته یا نه ؟؟ و اگر آره کد نویسیش باید به چه صورت باشه(بنده مبتدی هستم و زیاد با کدها آشنایی ندارم!)
و اگر راه بهتری هم هست ، چیه و چطوری ازش استفاده کنم؟؟
با تشکر از همه دوستانی که تا اینجا کمک کردن!:قلب:

Javad.Kashi
یک شنبه 10 بهمن 1389, 16:27 عصر
سلام
برای فراخوانی عکس هایی که اطلاعات دقیق از تعداد آنها را نداری می توانی از یک repeater و یا datalist که از کامپوننت های خود visual studio هستند استفاده کنی(به همین سادگی)
ادامه دارد...

Javad.Kashi
یک شنبه 10 بهمن 1389, 18:44 عصر
سلام مجدد
ببخشید اگر دیر شد.
اینم یه مثال توپ:


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Answers.aspx.cs" Inherits="Cultural_Eshop.Answers" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:tutorial %>"
SelectCommand="sp_Products_SelectAll" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
<asp:DataList ID="DataList1" runat="server" DataKeyField="ID" DataSourceID="SqlDataSource1">
<ItemTemplate>
<asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("ProductPictureUrl").ToString() %>' />
<br />
ProductGroupTitle:
<asp:Label ID="Title" runat="server" Text='<%# Eval("ProductGroupTitle") %>' />
<br />
Price:
<asp:Label ID="PriceLabel" runat="server" Text='<%# Eval("Price") %>' />
<br />
</ItemTemplate>
</asp:DataList>
</div>
</form>
</body>
</html>
همان طوری که می بینید یک datalist را به یک دیتابیس bind کرده ایم سپس در قسمت ItemTemplate ، یک کامپوننت Image قرار می دیم و بوسیله متد Eval آدرس ذخیره شده در دیتابیس را به عنوانImageUrl وارد می کنیم .

التماس دعا

awwex2007
دوشنبه 11 بهمن 1389, 20:37 عصر
سلام.
مثال خیلی خوب و واضحی بود.ولی نمیدونم چرا برای من عکس ها رو نمایش نمیده ؟؟
65791
همونطور که معلومه حتی وقتی به صورت دستی آدرسی که در پایگاه داده ذخیره شده بو د رو از آدرس نسبی (مثلا /images/1.jpg) به آدرس مستقیم (c:/web/images/1.jpg)تبدیل کردم باز هم فایل ها رو نشون نداد البته بگم که تا وقتی نسبی بود علامت ضربدر که نشان دهنده پیدا نکردن فایل بود رو نشان میداد ولی بعد از دستکاری به این شکل بالا در اومد.
به نظر شما مشکل از چیه؟
اینم کد من:

<asp:DataList ID="DataList1" runat="server" DataKeyField="pic_address"
DataSourceID="SqlDataSource1" RepeatDirection="Horizontal">
<ItemTemplate>
pic_address:

<%--<asp:Image ID="pic_addressLabel" runat="server"
ImageUrl='<%# Eval("pic_address") %>' />--%>
<asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("pic_address").tostring() %>' />
<br />
<asp:Label ID="Title" runat="server" Text='<%# Eval("pic_address") %>' />

<br />
</ItemTemplate>
</asp:DataList>

m.doostdar
دوشنبه 11 بهمن 1389, 22:07 عصر
در باره ذخیره سازی عکس ها دوستان گفتند که توی یک پوشه ذخیره بشه بهتره
اما چطور از دسترسی هر شخصی به این عکس ها یا فایل ها جلوگیری کنیم؟؟
اگر کسی ادرس عکس رو تایپ کنه که عکس براش باز میشه!!!
یکی از دوستان گفتند که توی قسمت App_Data ذخیره کن و برای نمایش هم از یک Handler استفاده کن
میشه یه کد برای این روش بگذارد؟؟ ممنون:لبخندساده:

awwex2007
دوشنبه 11 بهمن 1389, 22:56 عصر
در ادامه سوال قبلیم من هم با این دوستمون موافقم اتفاقا به این قضیه فکر میکردم که چطور میشه محدودیت رو برای هر کاربر اعمال کرد.

awwex2007
سه شنبه 12 بهمن 1389, 01:00 صبح
مشکل حل شد .ایراد در آدرس دهی بود نباید برای امتحان کردن از آدرس دهی مستقیم استفاده میکردم .فقط میتونه آدرس نسبی بهش بدیم.