2011-02-03 2 views
40

Я пытаюсь использовать valums ajax uploader. http://valums.com/ajax-upload/MVC3 Valums Ajax Загрузка файла

У меня есть следующие на моей странице:

var button = $('#fileUpload')[0]; 
var uploader = new qq.FileUploader({ 
    element: button, 
    allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'], 
    sizeLimit: 2147483647, // max size 
    action: '/Admin/Home/Upload', 
    multiple: false 
}); 

это сообщения в мой контроллер, но qqfile всегда нуль. Я пробовал:

public ActionResult Upload(HttpPostedFile qqfile) 
AND 
HttpPostedFileBase file = Request.Files["file"]; 

не повезло.

Я нашел пример для рубина на рельсах, но не уверен, как реализовать это в MVC http://www.jigsawboys.com/2010/10/06/ruby-on-rails-ajax-file-upload-with-valum/

В поджигатель я вижу это: http://localhost:61143/Admin/Home/Upload?qqfile=2glonglonglongname+-+Copy.gif

enter image description here

enter image description here enter image description here

enter image description here

+0

Те сумасшедшие символы, которые вы видите может быть из-за той же самой причине - http://stackoverflow.com/questions/3183203/asp-net-mvc2-crazy-characters -in-view-output-wtf –

+0

Я опубликовал следующие https: // github.com/valums/ajax-upload/issues/100 –

ответ

68

Я понял это. это работает в IE и Mozilla.

[HttpPost] 
    public ActionResult FileUpload(string qqfile) 
    { 
     var path = @"C:\\Temp\\100\\"; 
     var file = string.Empty; 

     try 
     { 
      var stream = Request.InputStream; 
      if (String.IsNullOrEmpty(Request["qqfile"])) 
      { 
       // IE 
       HttpPostedFileBase postedFile = Request.Files[0]; 
       stream = postedFile.InputStream; 
       file = Path.Combine(path, System.IO.Path.GetFileName(Request.Files[0].FileName)); 
      } 
      else 
      { 
       //Webkit, Mozilla 
       file = Path.Combine(path, qqfile); 
      } 

      var buffer = new byte[stream.Length]; 
      stream.Read(buffer, 0, buffer.Length); 
      System.IO.File.WriteAllBytes(file, buffer); 
     } 
     catch (Exception ex) 
     { 
      return Json(new { success = false, message = ex.Message }, "application/json"); 
     } 

     return Json(new { success = true }, "text/html"); 
    } 
+1

Это должно быть отмечено как ответ, поскольку это более полная. Хорошая работа Шейн, полностью помогла мне. –

+1

Я бы согласился. Я написал более полное многоразовое решение, но это делает то же самое. –

+1

Только проблема: весь файл буферизуется в памяти. 2GB видео? Лучше взять меньшие (100 кбайт) куски из потока и записать это в поток файлов, прежде чем получить следующий фрагмент и т. д. – saille

1

Этот компонент отправляет application/octet-stream вместо multipart/form-data, с которым может работать связующее устройство по умолчанию. Поэтому вы не можете ожидать, что Request.Files будет иметь какое-либо значение с таким запросом.

Вам нужно будет вручную прочитать поток запроса:

public ActionResult Upload(string qqfile) 
{ 
    var stream = Request.InputStream; 
    var buffer = new byte[stream.Length]; 
    stream.Read(buffer, 0, buffer.Length); 

    var path = Server.MapPath("~/App_Data"); 
    var file = Path.Combine(path, qqfile); 
    File.WriteAllBytes(file, buffer); 

    // TODO: Return whatever the upload control expects as response 
} 
+0

не работает в IE :( – ShaneKm

+0

У меня это есть: но я не могу понять, как его реализовать: IE не отправляет поток в «request.InputStream «... вместо этого получайте входной поток через HttpPostedFileBase из коллекции Request.Files []. – ShaneKm

+0

не работает в Chrome – KevinDeus

1

IE загрузку с использованием многослойного-мима. Другие браузеры используют Octet-Stream.

Я написал обработчик загрузки для работы с Valums Ajax Uploader, который работает как с MVC & Webforms & оба метода загрузки. Я был бы рад поделиться с вами, если бы захотел. Он внимательно следит за обработчиком PHP.

Мой контроллер для обработки загрузки выглядит следующим образом:

public class UploadController : Controller 
{ 
    private IUploadService _Service; 

    public UploadController() 
     : this(null) 
    { 
    } 

    public UploadController(IUploadService service) 
    { 
     _Service = service ?? new UploadService(); 
    } 

    public ActionResult File() 
    { 
     return Content(_Service.Upload().ToString()); 
    } 

UploadService выглядит следующим образом:

public class UploadService : IUploadService 
{ 
    private readonly qq.FileUploader _Uploader; 

    public UploadService() 
     : this(null) 
    { } 

    public UploadService(IAccountService accountservice) 
    { 
     _Uploader = new qq.FileUploader(); 
    } 

    public UploadResult Upload() 
    { 
     qq.UploadResult result = _Uploader.HandleUpload(); 
     if (!result.Success) 
      return new UploadResult(result.Error); 

        .... code ..... 

     return new UploadResult((Guid)cmd.Parameters["@id"].Value); 
     } 
     catch (Exception ex) 
     { 
      return new UploadResult(System.Web.HttpUtility.HtmlEncode(ex.Message)); 
     } 
     finally 
     { 
         ............code......... 
     } 

    } 

    ...............code ............ 
+1

Не могли бы вы рассказать полный внутренний код? – Tomas

0

Я развиваюсь в ASP.Net 4.0, но у нас нет архитектуры MVC. У меня была такая же проблема несколько дней назад. Но я понял это, и вот мое решение.

//For IE Browser 
HttpPostedFile selectedfile = Request.Files[0]; 
System.Drawing.Bitmap obj = new System.Drawing.Bitmap(selectedfile.InputStream); 

//For Non IE Browser 
System.Drawing.Bitmap obj = new System.Drawing.Bitmap(Request.InputStream); 

Теперь вы можете использовать obj для дальнейшей работы.

1

Вы должны попробовать:

Stream inputStream = (context.Request.Files.Count > 0) ? context.Request.Files[0].InputStream : context.Request.InputStream;