ورود

View Full Version : اپلود و ذخیره عکس



sunn789
پنج شنبه 02 آبان 1392, 23:40 عصر
سلام
برا اپلود عکس تو اینترنت خیلی گشتم از Helper ها تا استفاده از form
برا کنترل
public ActionResult FileUpload(HttpPostedFileBase file)
{
if (file != null)
{
string pic = System.IO.Path.GetFileName(file.FileName);
string path = System.IO.Path.Combine(
Server.MapPath("~/images/profile"), pic);
// file is uploaded
file.SaveAs(path);

و برای وییو

div class="editor-field">
@Html.BeginForm("FileUpload", "C", FormMethod.Post, new { enctype = "multipart/form-data" })
{
<label for="file">فرستادن عکس:</label>
<input type="file" name="file" id="file" style="width: 100%;" />
<input type="submit" value="Upload" class="submit" />
}

@Html.ValidationMessageFor(model => model.E_Image)
خوب حالا زمانی رو اپلود کلیک میکنم پیغام میاد که

The تصویر field is required.
چه کنیم
درضمن توی صفحه قرار نیست فقط عکس اپلود شه قراره یه سری فیلد دیگه مثل نام و نام خانوادگی و ...
هم تو بانک ذخیره شه
متشکر میشم کمکم کنید

alireza_s_84
جمعه 03 آبان 1392, 17:37 عصر
@Html.ValidationMessageFor(model => model.E_Image)
شما کنترل مربوط به .E_Image رو در صفحه قرار ندادی. اگر به فایل شما اشاره داره پس این خط رو عوض کنید:
<input type="file" name="file" id="file" style="width: 100%;" />

sunn789
جمعه 03 آبان 1392, 21:06 عصر
این رو هم انجام دادم
اما یاز هم نشد کدها رو عوض کردم ، برک پوینت اضافه کردم دو تا مشکل دارم که هر کدووم حل شه امیدوارم مشکل حل شه،تو
<div class="editor-field">

<img src="@Url.Content(Model.E_Image)" width="150" onclick="ChangeImage()" />
<div>
@using (Html.BeginForm("index","FileUpload", FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
<input type="file" name="file" id="file" style="width: 100%;" />
<input type="submit" value="Upload" class="submit" />
}
</div>
@Html.TextBoxFor(model=>model.E_Image)
@Html.ValidationMessageFor(model => model.E_Image)
</div>
کنترل UploadFile و اکشن Index رو دارم ولی زمانی کمپایلر به اینجا میرسه اصلاً توی کنترل نمیره
و توی اکشن Edit میره ولی file که به اون پاس شده خالی است و ذخیره نمیشه

bade saba
جمعه 03 آبان 1392, 23:06 عصر
تگ [HttpPost] رو قرار دادی که مشخص کنی که باید به شکل post اطلاعات دریافت کنه؟ چون اگه این رو قرار ندی کار نمیکنه

کدت باید اینجوری باشه در واقع

[HttpPost]
public ActionResult FileUpload(HttpPostedFileBase file)
{
...

hakim22
شنبه 04 آبان 1392, 08:33 صبح
اینطور که به نظر میرسه شما با Model Binding مشکل دارید. یک جاهایی از پیشفرض ها استفاده کرده اید و یکجاهایی اونها رو نقض کرده اید . اول اینکه یکبار مباحث مربوط به Model Binding رو مرور کنید.
دوم اینکه ابزار Fiddler رو نصب کنید و یا برای تست ارسال و دریافت فایل از بخش Network در Developer Tools مربوط به IE یا Chrome استفاده کنید تا ببینید چه اطلاعاتی به سرور ارسال میشود.

در حالت اول مشکل شما اینه که در تگ زیر :


<input type="file" name="file" id="file" style="width: 100%;" />


قسمت Name را روی File تنظیم کرده اید. در حالی که باید روی E_Image باشد. در واقع Model Binding در ASP.MVC خصوصیت Name در HTML را با نام فیلد در Model تطابق میدهد.

شما میتوانید ترکیبی از فیلد فایل در کنار هر تعداد فیلد دیگری به کنترلر ارسال کنید. وقتی یک Request به کنترلر میرسد Model Binding تلاش میکند داده های دریافتی را روی کلاسهایی که به عنوان ورودی مشخص کرده اید مطابقت دهد. هرکدام از فیلدها که همنام با داده ی ارسالی بود پر میکند. (اینکار همزمان برای ViewBag و همینطور برای Route Value هم انجام میشود)

در صورتی که هیچ فیلدی مطابقت داده نشد اکشن مورد نظر در کنترلر اجرا نمیشود. شما میتوانید دو یا چند کلاس به عنوان پارامترهای ورودی در یک اکشن کنترلر قرار دهید.

star_rh
شنبه 04 آبان 1392, 09:18 صبح
این نمونه کدیه که من درست عمل می کنه و تست شده است.

[HttpPost]
public ActionResult UploadImage(UploadImageModel model)
{
foreach (string r in Request.Files)
{
var file = Request.Files[r] as HttpPostedFileBase;
if (file != null)
{
if (file.ContentLength > 0)
{
Guid id = Guid.NewGuid();
string gExtension = System.IO.Path.GetExtension(file.FileName);
string path = "~/upload/gallery/" + id + gExtension;
var fn = Server.MapPath(path);

if (!System.IO.File.Exists(fn))
{
file.SaveAs(fn);
_context.Images.Add(new Models.Image()
{
Id = Guid.NewGuid(),
Name = file.FileName,
Descript = model.Descript,
Path = path,
UrlAddress = model.UrlAddress
});

_context.SaveChanges();

//Redirect to index
return RedirectToAction("Index", "Gallery");
}
}
else
{
ModelState.AddModelError("File", "This name is already registerd!");
return View(model);
}
}
else //Otherwise we add an error and return to the (previous) view with the model data
ModelState.AddModelError("File",
"Your upload did not seem valid. Please try again using only correct images!");
}
ModelState.AddModelError("File","Image Not Recieve!");
return View(model);
}


در زیر به Null ها دقت کن/

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" ,@class="mws-form"}))
{
@Html.ValidationSummary(true)
<div class="mws-form-row">
@Html.LabelFor(model => model.File, new { @class = "mws-form-label" })
<div class="field" style="margin-right: 150px;">
<div style="width: 200px;height: 150px" class="fileupload-new thumbnail">
<img id="preview" width="100%" height="100%"/>
</div>
</div>
<div class="mws-form-item">
@Html.FileFor(model => model.File)
@Html.ValidationMessageFor(model => model.File)
</div>
</div>
}

sunn789
شنبه 04 آبان 1392, 15:01 عصر
سلام و متشکر میشه بفرمایید "UploadImageModel " کجا بود؟

sunn789
شنبه 04 آبان 1392, 20:23 عصر
سلام قسمت name رو تبدیل به Image کردم اما باز هم زمانی روش breakpoint میذارم null هست
در موررد [HttpPOost] رو هم میگذارم

star_rh
یک شنبه 05 آبان 1392, 13:45 عصر
کلاس مدل UploadImageModel


public class UploadImageModel
{
public HttpPostedFileBase File { get; set; }
}

sunn789
یک شنبه 05 آبان 1392, 22:15 عصر
متشکر اما ایا اگه مدل من این باشه چه باید بکنم
public class PublicContent
{
public int id { get; set; }
[Required]
[Display(Name="موضوع")]
public string E_Subject { get; set; }
[Required]
[Display(Name = "خلاصه")]
public string E_ShortText { get; set; }
[Required]
[Display(Name = "تیتر")]
public string E_Title { get; set; }
[Required]
[Display(Name = "متن")]
public string E_Text { get; set; }
[Required]
[Display(Name = "تصویر")]
public string E_Image { get; set; }
[Display(Name = "تاریخ")]
public DateTime E_CreateDate { get; set; }
public virtual IList<User> Users { get; set; }

[Required]
[Display(Name="نمایش")]
public bool Show { get; set; }

[Required]
[Display(Name="نمایش در صفحه اول")]
public bool ShowInFirstPage { get; set; }

[Display(Name = "موضوع اصلی")]
public int Objects { get; set; }

public IEnumerable<SelectListItem> PublicObjects { get;set;}
}

sunn789
چهارشنبه 08 آبان 1392, 12:09 عصر
یعنی راه خاصی نبود؟

uniqueboy_ara
جمعه 10 آبان 1392, 00:29 صبح
آقا واسه من اینو نداره:
@Html.FileFor