2011-05-23 20 views
8

Por lo tanto, he implementado plupload usando flash runtime en MVC3.Usando plupload con MVC3

Funciona perfectamente, en el sentido de que se carga con la acción de corrección y lo ejecuta todo. Sin embargo, me gustaría poder controlar la respuesta y manejarla en plupload, pero parece que no puedo obtener ninguna respuesta.

He intentado reemplazar el archivo cargado, pero parece que no puedo sacar nada de los argumentos. He intentado devolver cadenas simples, json y qué es lo que tienes. Parece que no puedo sacar nada del lado del cliente. Y, por supuesto, se envía a través de flash, ni siquiera puedo depurar las solicitudes con firebug:/

Lo mismo con el evento de error y lanzando excepciones. Correctamente interpreta la excepción como un error, pero siempre es #IO ERROR con algún código como 2038 o algo que sale por el otro extremo. No puedo mostrar mi cadena de excepción ni nada. ¿Alguien puede ayudar?

Pregunta de bonificación: ¿Cómo enviaría datos de sesión/cookie junto con la plupload, para poder acceder a la sesión en mi acción?

Respuesta

13

El siguiente ha trabajado para mí:

[HttpPost] 
public ActionResult Upload(int? chunk, string name) 
{ 
    var fileUpload = Request.Files[0]; 
    var uploadPath = Server.MapPath("~/App_Data"); 
    chunk = chunk ?? 0; 
    using (var fs = new FileStream(Path.Combine(uploadPath, name), chunk == 0 ? FileMode.Create : FileMode.Append)) 
    { 
     var buffer = new byte[fileUpload.InputStream.Length]; 
     fileUpload.InputStream.Read(buffer, 0, buffer.Length); 
     fs.Write(buffer, 0, buffer.Length); 
    } 
    return Json(new { message = "chunk uploaded", name = name }); 
} 

y en el cliente:

$('#uploader').pluploadQueue({ 
    runtimes: 'html5,flash', 
    url: '@Url.Action("Upload")', 
    max_file_size: '5mb', 
    chunk_size: '1mb', 
    unique_names: true, 
    multiple_queues: false, 
    preinit: function (uploader) { 
     uploader.bind('FileUploaded', function (up, file, data) { 
      // here file will contain interesting properties like 
      // id, loaded, name, percent, size, status, target_name, ... 
      // data.response will contain the server response 
     }); 
    } 
}); 

En lo que se refiere a la cuestión de bonificación estoy dispuesto a responder a ella por no usar sesiones , ya que no escalan bien, pero como sé que probablemente no le guste esta respuesta, tiene la posibilidad de pasar una identificación de sesión en la solicitud usando el multipart_params:

multipart_params: { 
    ASPSESSID: '@Session.SessionID' 
}, 

y luego en el servidor perform some hacks para crear la sesión correcta.

+0

Sólo por curiosidad, ¿qué le usar en lugar de una sesión? Solo por ejemplo en mi caso, lo estoy usando simplemente para obtener el usuario conectado. – Dynde

+0

@Dynde, eso dependerá de la situación que estoy dispuesto a implementar. Por ejemplo, para obtener el nombre de usuario conectado, usaría la cookie de autenticación de formularios => User.Identity.Name, y si necesitaba ingresar la información del usuario, consultaría el servicio Profile, que obtendría esta información donde la guarde mi aplicación. (generalmente una base de datos). –

+0

Te escucho. Para mí, esa consulta de perfil es solo algo que podría evitarse con la sesión, ya que hasta hoy no sabía que usar la sesión para esto era una mala idea :) – Dynde

5

vistazo aquí:

$("#uploader").pluploadQueue({ 
     // General settings 
     runtimes: 'silverlight', 
     url: '/Home/Upload', 
     max_file_size: '10mb', 
     chunk_size: '1mb', 
     unique_names: true, 
     multiple_queues: false, 

     // Resize images on clientside if we can 
     resize: { width: 320, height: 240, quality: 90 }, 

     // Specify what files to browse for 
     filters: [ 
      { title: "Image files", extensions: "jpg,gif,png" }, 
      { title: "Zip files", extensions: "zip" } 
     ], 

     // Silverlight settings 
     silverlight_xap_url: '../../../Scripts/upload/plupload.silverlight.xap' 
     }); 

     // Client side form validation 
     $('form').submit(function (e) { 
     var uploader = $('#uploader').pluploadQueue(); 

     // Files in queue upload them first 
     if (uploader.files.length > 0) { 
      // When all files are uploaded submit form 
      uploader.bind('StateChanged', function() { 
       if (uploader.files.length === (uploader.total.uploaded + uploader.total.failed)) { 
        $('form')[0].submit(); 
       } 
      }); 

      uploader.start(); 
     } else { 
      alert('You must queue at least one file.'); 
     } 

     return false; 
     }); 

Y en Controlador:

[HttpPost] 
public string Upload() { 
      HttpPostedFileBase FileData = Request.Files[0]; 

      if (FileData.ContentLength > 0) { 
      var fileName = Path.GetFileName(FileData.FileName); 
      var path = Path.Combine(Server.MapPath("~/Content"), fileName); 
      FileData.SaveAs(path); 
      } 

      return "Files was uploaded successfully!"; 
     } 

Eso es todo ... No se necesita ningún trozo del d ...

Cuestiones relacionadas