2013-02-21 2 views
1

Я использую форму ajax для отправки нескольких файлов, загружаемых на сервер. Это то, что моя форма выглядитasp.net mvc 4 upload file using ajax form helper

@using (@Ajax.BeginForm("SaveProjectSummary", "Project", new { id = Model.ProjectId }, new AjaxOptions { OnSuccess = "Add_OnCompleteSummarySave()" }, new { enctype = "multipart/form-data" })) 

я могу, что приводит меня к желаемому действию, но я не могу найти что-нибудь в Request.Files на сервере. просто хочу быть уверенным, что я использую это право, которое мне не кажется, поэтому любая помощь будет очень оценена.

ответ

2

К сожалению, Ajax.BeginForm не может быть загружен для загрузки файлов.

  • Есть плагины, такие как Uploadify

http://www.uploadify.com/forum/#/discussion/1685/uploadify-and-ajax/p1

  • или это JQuery плагин

http://malsup.com/jquery/form/

+0

это страшно .. пытается с нормальной формой ... – afr0

+1

@ afr0, нормальный Html.BeginForm сделал бы это. Но есть подходы AJAX. Проверьте мой пересмотренный ответ на некоторые альтернативы. –

+0

Я не хочу включать swf. – afr0

2

Другой большой компонент загрузчиком является PlUpload

http://www.plupload.com/

Это делает:

  • швырнул файл загрузчик, так что вы можете загружать большие файлы. Например. 100Mb масштабирование
  • файла на стороне клиента
  • перетащить выбор файла

FYI, код на стороне сервера в .NET для обработки почтовых запросов от PlUpload:

var chunk = Request.Form["chunk"] != null ? int.Parse(Request.Form["chunk"]) : 0; 

var fileName = Request.Form["name"] ?? ""; 

//open a file, if our chunk is 1 or more, we should be appending to an existing file, otherwise create a new file 
var fs = new FileStream(Server.MapPath("/files/" + fileName), chunk == 0 ? FileMode.OpenOrCreate : FileMode.Append); 

//write our input stream to a buffer 
var buffer = new Byte[Request.Files[0].InputStream.Length]; 
Request.Files[0].InputStream.Read(buffer, 0, buffer.Length); 

//write the buffer to a file. 
fs.Write(buffer, 0, buffer.Length); 
fs.Close(); 

Если вы стремясь свернуть свой собственный компонент, проверьте API файловой системы, доступный в современных браузерах. Это позволяет получить файл содержимого двоичного файла и загрузить его с помощью AJAX позвонить

+0

очень интересно. хотите протестировать этот диск. –

+1

Я использовал его для загрузки изображений для http://www.geolocation.ws Посмотрите, как это работает –

+1

@MaksymKozlenko работает с asp.net mvc ajax form helper? – afr0

0

[HttpPost] общественного JsonResult UploadImage (HttpPostedFileWrapper ImageFile) {

 if (imageFile == null || imageFile.ContentLength == 0 || imageFile.ContentLength > 205168) 
     { 

      return new JsonResult 
      { 
       ContentType = "text/html", 
       Data = "No file was uploaded." 

      }; 
     } 

     if (imageFile == null || imageFile.ContentLength == 0 || (imageFile.ContentType != "image/png" && imageFile.ContentType != "image/jpg" && imageFile.ContentType != "image/jpeg" && imageFile.ContentType != "image/pjpeg")) 
     { 
      return new JsonResult 
      { 
       ContentType = "text/html", 
       Data = "Type" 
      }; 
     } 
     if (Session["CityId"] != null) 
     { 
      if (MdlNadal == null) 
      { 
       MdlNadal = new mdlNadal(); 
      } 
      string strFilePaths = ""; 

      int CityId = Convert.ToInt32(Session["CityId"].ToString()); 
      string strCityName = ""; 
      if (Session["CityName"] != null) 
      { 
       strCityName = Session["CityName"].ToString(); 
      } 

      string strFileNames = imageFile.FileName.Replace(@"\", "/"); 
      string imgPath = ConfigurationManager.AppSettings["ImagePath"].ToString().Replace("~", ""); 
      strFileNames = strFileNames.Split('/')[strFileNames.Split('/').Length - 1]; 
      Session["ImageName"] = strFileNames; 
      ViewBag.ImageName = strFileNames; 
      strFilePaths = Request.Url.Scheme + "://" + Request.Url.Authority + imgPath + strCityName + "" + CityId + "/" + strFileNames; 
      MdlNadal.UpdateCityImageByCityID(CityId, strFilePaths); 
      if (imageFile != null) 
      { 
       if (!Directory.Exists(Server.MapPath(Url.Content(ConfigurationManager.AppSettings["ImagePath"].ToString() + strCityName + "" + CityId)))) 
       { 
        Directory.CreateDirectory(Server.MapPath(Url.Content(ConfigurationManager.AppSettings["ImagePath"].ToString() + strCityName + "" + CityId))); 
       } 
       else 
       { 
        int counts = Directory.GetFiles(Server.MapPath(Url.Content(ConfigurationManager.AppSettings["ImagePath"].ToString() + strCityName + "" + CityId))).Count(); 
        if (counts > 1) 
        { 
         string[] StrArr = Directory.GetFiles(Server.MapPath(Url.Content(ConfigurationManager.AppSettings["ImagePath"].ToString() + strCityName + "" + CityId))); 
         for (int i = 0; i <= counts - 1; i++) 
         { 
          string strFileNameCheck = StrArr[i]; 
          //strFileNameCheck = strFileNameCheck.Replace(@"\", "/"); 
          //strFileNameCheck = strFileNameCheck.Split('/')[strFileNameCheck.Split('/').Length - 1]; 
          try 
          { 
           System.IO.File.Delete(strFileNameCheck); 
          } 
          catch (Exception ex) 
          { 
           throw ex; 
          } 

         } 
        } 
       } 
       var FilePath = Path.Combine(Server.MapPath(Url.Content(ConfigurationManager.AppSettings["ImagePath"].ToString() + strCityName + "" + CityId)), strFileNames); 
       imageFile.SaveAs(FilePath); 
      } 

     } 

     return new JsonResult 
     { 
      ContentType = "text/html", 
      Data = "Save" 

     }; 
    } 

@using (Html.BeginForm ("UploadImage », "Надаль", FormMethod.Post, новый { ENCTYPE = "многочастному/форм-данных", ID = "MWS-Подтвердить", целевой = "UploadTarget", @class = "MWS-форма" })) {

    <label class="title10"> 
         <strong>Choose a background for this city</strong> 
        </label>            
        <div class="mws-form-item large"> 
         <input type="file" name="imageFile" id="imageFile" onchange="return SetAttachFlag();" /> 
         (Supported File Types : .jpg, .jpeg, .png) (Maximum Size: 200 Kb) 
         <iframe id="UploadTarget" name="UploadTarget" onload="UploadImage_Complete();" style="position: absolute; 
          left: -999em; top: -999em;"></iframe> 
        </div> 

       } 
+0

Я не хочу использовать BeginForm, это единственная проблема с вашим кодом – afr0

+0

Кстати, вам не нужно использовать iframe для отправки изображения из BeginForm. – afr0

0

Почему бы не воспользоваться API файлов в HTML5. Посмотрите на эти ссылки, чтобы указать вам в правильном направлении.

http://www.html5rocks.com/en/tutorials/file/dndfiles/

http://timothypoon.com/blog/2011/05/10/ajax-uploading-with-html5s-file-api/

+0

Мне очень нравится файл HTML5 File Apis и дал ему попробовать, и он работает с chrome и FF, но IE9, который я использую, не поддерживает эти API, которые действительно отсасывают MS, они идут в направлении с открытым исходным кодом с помощью такого типа браузер .. только какой-то гений может придумать эту идею. – afr0

+0

я достиг нескольких файлов, отправляемых на сервер с помощью Html.BeginForm, но для этого требуется, чтобы вся форма была отправлена ​​вместе с файлами, которые разрывают весь мой пользовательский интерфейс, поэтому я думаю, теперь jquery - моя последняя ставка – afr0