2011-02-03 19 views
40

Estoy tratando de usar valums ajax uploader. http://valums.com/ajax-upload/MVC3 Valums Ajax Carga de archivos

Tengo el siguiente en mi página:

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 
}); 

que publique a mi controlador de qqfile pero siempre es nula. Probé siguientes:

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

sin ninguna suerte.

He encontrado un ejemplo para el rubí en los carriles, pero no está seguro de cómo ponerlo en práctica en MVC http://www.jigsawboys.com/2010/10/06/ruby-on-rails-ajax-file-upload-with-valum/

En firebug veo esto: 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

Esos locos personajes que se está viendo podría ser debido a esta misma razón - http://stackoverflow.com/questions/3183203/asp-net-mvc2-crazy-characters -in-view-output-wtf –

+0

He publicado el siguiente https: // github.com/valums/ajax-upload/issues/100 –

Respuesta

68

lo he descubierto. esto funciona en IE y 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

Esto debe marcarse como la respuesta, ya que es más completo. Buen trabajo Shane, me ayudó por completo. –

+1

Estoy de acuerdo. Escribí una solución reutilizable más completa, pero lo anterior hace lo mismo. –

+1

Único problema: todo el archivo está siendo almacenado en memoria. un video de 2GB? Es mejor tomar fragmentos más pequeños (100kB) de la transmisión y escribirlos en una secuencia de archivos antes de obtener el siguiente fragmento, etc. – saille

1

Este componente está enviando un application/octet-stream en lugar de multipart/form-data, que es con lo que puede funcionar el archivador de modelo predeterminado. Por lo tanto, no puede esperar que Request.Files tenga ningún valor con dicha solicitud.

Usted tendrá que leer manualmente la corriente de petición de:

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

no funciona en IE, sin embargo :( – ShaneKm

+0

Me surge esto: pero no puedo encontrar la manera de implementarlo: IE no envía la secuencia en "request.InputStream" "... en su lugar obtener la corriente de entrada a través de la HttpPostedFileBase de la colección Request.Files [] – ShaneKm

+0

no funciona en Chrome – KevinDeus

1

subidas es decir, utilizando multiparte MIME. Otros navegadores usan Octet-Stream.

Escribí un controlador de carga para trabajar con Valums Ajax Uploader que funciona con MVC & Webforms & ambos métodos de carga. Estaría feliz de compartir con usted si quisiera. Sigue de cerca el manejador de PHP.

Mi controlador para manejar la carga se ve así:

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()); 
    } 

El UploadService ve esto:

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

¿Podría compartir el código de back-end completo? – Tomas

0

estoy desarrollando en ASP.Net 4.0, pero que no tienen una arquitectura MVC. Tuve el mismo problema hace unos días. Pero, lo descubrí y aquí está mi solución.

//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); 

Ahora, puede usar obj para una operación posterior.

1

Usted debe tratar:

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