سلام به همه دوستان
من می خام یه فایل عکس از کاربر بگیرم و توی دیتا بیس ذخیره کنم اما نمی خام صفحه رفرش بشه
راه حل چیه؟؟؟
سلام به همه دوستان
من می خام یه فایل عکس از کاربر بگیرم و توی دیتا بیس ذخیره کنم اما نمی خام صفحه رفرش بشه
راه حل چیه؟؟؟
سلام.
این کار رو باید با ajax انجام بدین.
یک افزونه جکوئری هست به نام ajax.beginform که می تونی از اون استفاده کنید.
و یا بصورت زیر هم می تونین کار کنید.
http://www.codeproject.com/Articles/...jQuery-and-MVC
http://stackoverflow.com/questions/2...mage-with-ajax
شما می تونید یک fileupload داخل صفحه تون بذارید
<input type="file" name="Image" value="Choose..." class="input-large" />
در کنترلر موقع ثبت
if (Request.Files.Count > 0)
{
var image = Request.Files[0];
if (image != null)
{
var imageBuffer = new byte[image.ContentLength];
image.InputStream.Read(imageBuffer, 0, image.ContentLength);
}
تصویر را به صورت byte[] در دیتابیس ذخیره کنید.
تبدیل عکس به byte ذخیره کردن اون در دیتابیس کاملا اشتباه هست. حتی اگر این کار شرکتی هم انجام بشه باز اشتباه هستش . برای ذخیره عکس بهترین راه اپلود عکس و قرار دادن مسیر عکس در فیلد مورد نظر در دیتابیس هستش. برای انجام اینکار به انتهای عکس هم میتونید با استفاده Guid مقدار یکتا وغیر تکراری اضافه کنید که دیگه مشکل overwrite رو نداشته باشید .
آخرین ویرایش به وسیله RIG000 : یک شنبه 30 فروردین 1394 در 13:42 عصر دلیل: اوکی
تفکر تبدیل به بایت کردن عکس برای امنیت بالای عکس غلط هست.
بهتر این هست که عکس اپلود بشه و ادرس یکتاش تو فیلد یا فیلد های مورد نظر باشه ...
اگر حجم فایل شما کم هم باشه بعدا بابت تفکرات پیش بینی نشده برنامه نویسی به مشکل لودینگ با تعداد رکورد های زیاد میخورید.
عملا در حجم دیتابیس تاثیر بسزایی داره .
جدا از اینکه شما تبدیل به بایت و مجددا به تبدیل به فرمت مورد نظر رو هنگام ذخیره سازی و واکشی رو هم در بایت کردن دارید.
سلام.
ببخشید.
ذخیره سازی عکس بصورت بایت زیاد کار درستی نیست.
مر اینکه حذف شدن عکس ها هزینه زیادی واسه سایت داشته باشه.
در مورد مطلبی که نوشتم اشتباه نوشتم ajax.beginform افزونه نیست برای خود mvc.
اون افزونه اسمش ajax.form هست که یک فایل jquey هست که باید در صفحه مورد نظر قرار بگیره.
برای استفاده از اون هم نیازی نیست ajax.beginform نوشته بشه و فقط نیازه html.beginform نوشته بشه و خودش عکس رو بعد انتخاب آپلود می کنه.
اما من زیاد توصیه نمی کنم استفاده از اون رو
موفق باشید
ایشون گفته بودن بدون رفرش شدن صفحه ، یعنی از طریق ایجکس ، روش شما پست بک کامل رخ میده.
بهترین روش برای داشتن اطلاعات یکپارچه نگهداری فایل های مرتبط به یک موضوع در دیتابیس هست. برای مثال با داشتن یک پست در صورت حذف اون مطلب باید عکس های مرتبط با اون هم حذف بشن. اگر شما مطلب رو حذف کنید و در هنگام حذف عکسها خطایی رخ بده اونوقت شما حافظه ای از سرور رو پر کردین با اطلاعاتی که به اونها نیازی نیست. درست نقطع مقابلش اگر ابتدا عکسها حذف بشن بعد مطلب که باز ممکنه خطایی در حذف مطلب رخ بده که نتیجه مشخصه.تبدیل عکس به byte ذخیره کردن اون در دیتابیس کاملا اشتباه هست. حتی اگر این کار شرکتی هم انجام بشه باز اشتباه هستش . برای ذخیره عکس بهترین راه اپلود عکس و قرار دادن مسیر عکس در فیلد مورد نظر در دیتابیس هستش. برای انجام اینکار به انتهای عکس هم میتونید با استفاده Guid مقدار یکتا وغیر تکراری اضافه کنید که دیگه مشکل overwrite رو نداشته باشید .
اگر نگران کارایی دیتابیس هستین تمامی پایگاه های داده ی جدید از FileTable استفاده میکنن که با حفظ کامل کارایی ، فایل های شما رو نگهداری میکنن و این روشی اصولیتر و بهتر است.
با استفاده از توضیحاتی که در روش قبل گفتم افزایش حجم دیتابیس اصلا نکته منفی محسوب نمیشه و در عوض شما اطلاعاتی جامع و یکپارچه دارین. ضمن اینکه در نتیجه جستجو و سرعت عمل پایگاه داده نه فقط نتیجه نامطلوب نداره تازه باعث افزایش کارایی میشه.عملا در حجم دیتابیس تاثیر بسزایی داره .
جدا از اینکه شما تبدیل به بایت و مجددا به تبدیل به فرمت مورد نظر رو هنگام ذخیره سازی و واکشی رو هم در بایت کردن دارید.
تبدیل بایت ها به عکس و بالعکس هم کار هزینه بری نیست و هنگامیکه شما یک عکس رو از طریق IIS درخواست میدین بصورت بایت به مرورگر ارسال میشه. حالا چه به صورت یک فایل مجزا ذخیره شده باشه چه بصورت آرایه ای از بایت ها هیچ تفاوتی در نحوه برخورد با عکس وجود نداره تنها تفاوت در زمان دسترسی به این بایت هاست که در فایل چون مستقیما به فایل دسترسی داره کمی سرعت بیشتره ولی با توجه به سایر هزینه ها چندان امتیازی محسوب نمیشه.
من از روش زیر استفاده کردم و نتیجه بسیار مطلوبی هم گرفتم:سلام به همه دوستان
من می خام یه فایل عکس از کاربر بگیرم و توی دیتا بیس ذخیره کنم اما نمی خام صفحه رفرش بشه
راه حل چیه؟؟؟
ابتدا پلاگین jquery.form رو از آدرس http://malsup.com/jquery/form/ دریافت کنید.
نحوه استفاده هم بسیار ساده ست:
من فرمی به شکل زیر دارم که کار انتخاب عکس رو انجام میده:
حالا هروقت فرم Submit میشه شما باید با کمک پلاگین فوق و جی کوئری جلوی پست بک رو بگیرین و بصورت ایجکس اطلاعات رو به سرور ارسال کنید:کد HTML:<form id="frm-pro-up" method="post" action="@Url.Action("uploadprofilepicture", "profile")" enctype="multipart/form-data"> <input id="pro-file" name="file" type="file" accept="image/*" /> </form>
$('frm-pro-up').on('submit', function (event) {
var options = {
context: $(event.target),
beforeSend: function (xhr) {
//میتونید در اینجا یک لودر نمایش بدین
},
uploadProgress: function (event, position, total, percentComplete) {
var opc = percentComplete / 100;
//خاصیت بالا درصد آپلود عکس رو نشون میده
},
success: function (result) {
var data = $.parseJSON(result);
if (data.success) {
alert('عکس شما با موفقیت آپلود شد');
}
else if (data.fail) {
alert('خطایی در آپلود عکس رخ داده است.');
}
},
complete: function (xhr, status) {
//در اینجا لودر رو مخفی کنید
}
};
// pass options to ajaxForm
$(this).ajaxSubmit(options);
event.preventDefault();
});
اگر مشکلی بود بگین تا یک نمونه کامل براتون آپلود کنم.
سلام ممنون برای جواب کاملتون
اگر لطف کنین و یک نمونه قرار بدین ممنون می شم
چون نمی دونم دقیق چطور عمل کنم
سلام به شما
فایل پلاگین باید با چه اسمی و تو چه مسیری از پروژه ذخیره کنم ؟
اگه لطف کنین نمونه بزارین ممنون میشم
براتون یک نمونه از بکارگیری پلاگین رو براتون در مسیر زیر آپلود کردم سوالی بود مطرح کنید:
http://Trainbit.com/files/2591901884/FileUploader.zip
سلام...
شما میتونید از jquery ajaxform استفاده کنید...
1. اول از این ادرس پلاگین رو دانلود کنید http://malsup.com/jquery/form/
2. پلاگین رو به پروژتون اضافه کنید
3.فرم خودتون رو ایجاد کنید . مثل زیر
@using ("actionName","controllerName", FormMethod.Post, new { enctype = "multipart/form-data", id = "myUploadForm" }))
{
<input type="file" id="Image1" name="files"/>
} {
4. بعد اسکریپت با استفاده از پلاگین فرم رو ajax کنید . مثل زیر
$(document).ready(function () {
$("#myUploadForm").ajaxForm();
});
5. اکشن هم مثل این میشه
public virtual ActionResult AddImage(YourViewModel yourViewModel, HttpPostedFileBase image1)
{
if (ModelState.IsValid)
{
if (image1 != null)
{
string fileName = Guid.NewGuid().ToString();
//این قسمت میتونید فرمت فایل رو بدست بیارید
string fileType = System.IO.Path.GetExtension(image1.FileName);
string path = Server.MapPath("~") + "\\Files\\" + fileName + fileType;
yourViewModel.yourClass.Image1 = fileName + fileType;
}
}
}
6. بعدشم که فقط با repository که دارین ادش کنید...
سلام.
نمونه کد کوتاهی برای کم کردن حجم عکس و قرار دادن اون در دیتابیس و بعد خواندن و نمایش اون در ضفحه رو می خواستم اگه دوستان دارن .
ممنون.
یه کلاس بسازیذ با کدهای زیر
public static class ImageResize
{
public enum ImageComperssion
{
Maximum = 50,
Good = 60,
Normal = 70,
Fast = 80,
Minimum = 90,
}
public static void ResizeImage(this Stream inputStream, int width, int height, string savePath, ImageComperssion ic = ImageComperssion.Normal)
{
System.Drawing.Image img = new Bitmap(inputStream);
System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(result))
{
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQu ality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQua lityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality ;
g.DrawImage(img, 0, 0, width, height);
}
result.CompressImage(savePath, ic);
}
public static void ResizeImage(this System.Drawing.Image img, int width, int height, string savePath, ImageComperssion ic = ImageComperssion.Normal)
{
System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(result))
{
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQu ality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQua lityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality ;
g.DrawImage(img, 0, 0, width, height);
}
result.CompressImage(savePath, ic);
}
public static void ResizeImageByWidth(this Stream inputStream, int width, string savePath, ImageComperssion ic = ImageComperssion.Normal)
{
System.Drawing.Image img = new Bitmap(inputStream);
int height = img.Height * width / img.Width;
System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(result))
{
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQu ality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQua lityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality ;
g.DrawImage(img, 0, 0, width, height);
}
result.CompressImage(savePath, ic);
}
public static void ResizeImageByWidth(this System.Drawing.Image img, int width, string savePath, ImageComperssion ic = ImageComperssion.Normal)
{
int height = img.Height * width / img.Width;
System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(result))
{
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQu ality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQua lityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality ;
g.DrawImage(img, 0, 0, width, height);
}
result.CompressImage(savePath, ic);
}
public static void ResizeImageByHeight(this Stream inputStream, int height, string savePath, ImageComperssion ic = ImageComperssion.Normal)
{
System.Drawing.Image img = new Bitmap(inputStream);
int width = img.Width * height / img.Height;
System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(result))
{
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQu ality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQua lityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality ;
g.DrawImage(img, 0, 0, width, height);
}
result.CompressImage(savePath, ic);
}
public static void ResizeImageByHeight(this System.Drawing.Image img, int height, string savePath, ImageComperssion ic = ImageComperssion.Normal)
{
int width = img.Width * height / img.Height;
System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(result))
{
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQu ality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQua lityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality ;
g.DrawImage(img, 0, 0, width, height);
}
result.CompressImage(savePath, ic);
}
public static void CompressImage(this System.Drawing.Image img, string path, ImageComperssion ic)
{
System.Drawing.Imaging.EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Qu ality, Convert.ToInt32(ic));
ImageFormat format = img.RawFormat;
ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders().FirstOrDefault(c => c.FormatID == format.Guid);
string mimeType = codec == null ? "image/jpeg" : codec.MimeType;
ImageCodecInfo jpegCodec = null;
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
for (int i = 0; i < codecs.Length; i++)
{
if (codecs[i].MimeType == mimeType)
{
jpegCodec = codecs[i];
break;
}
}
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(path, jpegCodec, encoderParams);
}
}
برای ذخیره هم
Ipublic virtual ActionResult AddImage(YourViewModel yourViewModel, HttpPostedFileBase image1)
{
if (ModelState.IsValid)
{
if (image1 != null)
{
string fileName = Guid.NewGuid().ToString();
//این قسمت میتونید فرمت فایل رو بدست بیارید
string fileType = System.IO.Path.GetExtension(image1.FileName);
string path = Server.MapPath("~") + "\\Files\\" + fileName + fileType;
image1.InputStream.ResizeImageByWidth(500, path, ImageResize.ImageComperssion.Normal);
yourViewModel.yourClass.Image1 = fileName + fileType;
}
}
}
ممنون دوست عزیز.
این کلاس اکستنشن فشرده سازی رو دارم.
راخ حل بهتری برای این کار نیست؟
سلام
با اجرای کدهایی که برام فرستادین فایل عکس ذخیره می شه اما بعد از اجرای اکشن upload مرورگر یه صفحه دیگه باز می کنه و پیام متنی زیر در اون نمایش میده
{"success":true,"path":"http://Media/d4becd4b-4da8-441d-95fb-1ed976520f70.jpeg"}
متاسفانه به ویو اصلی برنمی گرده
باید چه کار کنم؟؟؟؟؟
سلام این همه جواب آخرش هم ...
با یه پلاگین این کار انجام میشه :
تو سایت استاد نصیری این را توضیح داده و مثالش هم پیوست شده ..
این هم لینکش:
http://www.dotnettips.info/post/1836...B1-asp-net-mvc
بخون اگر سوالی داشتی بپرس :
لینک
سلام به شما ممنون از لینک خوبی که گذاشتین اما من یه مشکلی دارم و اینکه
var isAjax = this.Request.IsAjaxRequest();
همیشه false هستش واینکه متد UploadFiles اجرا نمی شه
و بعد از ااجرای اکشنی که فرم به آن submit می کند یک ویو جدید اجرا می شه
دقیقا باید چه طور عمل کنم؟؟؟
البته خطای زیر رو در اجرای js ها داره:
Uncaught ReferenceError: intellisense is not defined
سلام
دوست داشتی مثالت را آپلود کن تا ببینم / بعد از اون استاد نصیری یک مثال خوب در این رابطه در پایان توضیحات پیوست کرده ... در ضمن کامنت ها را هم کامل بخون
سلام فایل zip شده مثالم در آدرس زیر قرار داره:
http://depositfiles.com/files/pbpoobxew
ممنون از بررسی شما
سلام وقت شما بخیر
من هر کاری می کنم متاسفانه دانلود نمیشه تو این سایت آپلود کن
http://uplod.ir/
ممنون
سلام مممنونم از شما
لینک دانلود
http://uplod.ir/867c523mr75q/MvcApplication4.rar.htm
سلام آقای روشن ضمیر لینک دانلودی که مجدد گذاشتم کار می کنه؟؟؟
سلام خانم صادقی مشکل برطرف شد و فایل آپلود شد ... در ضمن نیازی به نوع استاتیک نیست .... و مشکل شما در آدرس دهی بود
این هم لینک :
http://uplod.ir/rnv08e1a5y05/MvcApplication4.rar.htm
سلام ممنون از اینکه وقت گذاشتین و بررسی کردین
اما نمی دونم کجای کد تغییر کرده من کدوم آدرس اشتباه داده بودم؟؟؟
اگر از متغییر استاتیک استفاده نکنم خوب چهطور عکس ذخیره کنم؟؟؟
من عکس توی دیتابیس ذخیره می کنم همراه با بقیه مشخصات مثل نام و نام خانوادگی و آدرس