2012-03-06 11 views
6

Estoy intentando depurar una carga de archivos asíncrona que construí hace un tiempo y que ya no funciona, ya he pasado una gran cantidad de tiempo sin éxito.Carga de archivos asíncrona HTML5, la transmisión cargada siempre es inválida

La transmisión que el servidor está recibiendo siempre está dañada, de hecho, el archivo (imagen) que guardo no se puede abrir.

Para simplificar la depuración, configuré un nuevo proyecto ASP.NET, con dos archivos principales, el archivo HTML con el campo de formulario y el controlador ASP.NET.

A pesar de que el código aquí es muy trivial, ¡todavía no he tenido suerte! :(

Cualquier ayuda es muy apreciada, muchas gracias

<!DOCTYPE html> 
<html> 
<head> 
    <title>Upload Files using XMLHttpRequest - Minimal</title> 

    <script type="text/javascript"> 

     function uploadFile() { 
     var fd = new FormData(); 
     fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]); 
     var xhr = new XMLHttpRequest(); 

     xhr.addEventListener("load", uploadComplete, false); 
     xhr.addEventListener("error", uploadFailed, false); 
     xhr.addEventListener("abort", uploadCanceled, false); 
     xhr.open("POST", "Handler1.ashx"); 
     xhr.send(fd); 
     } 

     function uploadComplete(evt) { 
     /* This event is raised when the server send back a response */ 
     alert(evt.target.responseText); 
     } 

     function uploadFailed(evt) { 
     alert("There was an error attempting to upload the file."); 
     } 

     function uploadCanceled(evt) { 
     alert("The upload has been canceled by the user or the browser dropped the connection."); 
     } 
    </script> 
</head> 
<body> 
    <form id="form1" enctype="multipart/form-data" method="post" action="Handler1.ashx"> 

     <input type="file" name="fileToUpload" id="fileToUpload"/> 
     <input type="button" onclick="uploadFile()" value="Upload" /> 

    </form> 
</body> 
</html> 

y aquí está el manejador ashx:

using System; 
using System.Collections.Generic; 
using System.Web.Extensions; 
using System.Linq; 
using System.Web; 
using System.Web.Services; 
using System.IO; 
namespace MultipleFileUploadTest 
{ 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    public class Handler1 : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
      var stream = context.Request.InputStream; 

      MemoryStream memoryStream; 

      ReadFully(stream, out memoryStream); 

      Byte[] ba = memoryStream.ToArray(); 


      var path = @"C:\Users\giuseppe.JHP\Desktop\Image upload test\uploaded.gif"; 


      using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate)) 
      { 
       fs.Write(ba, 0, ba.Length); 
      } 

      //DEBUGGING CODE 
      //I'm opening the same file that was originally picked by the input form field and I'm now comparing the original file with the one received within the context stream. They always differ! 
      Byte[] ba2 = File.ReadAllBytes(@"C:\Users\giuseppe.JHP\Desktop\Image upload test\a.gif"); 

      //equal evaluates always to false 
      bool equal = ba.Length == ba2.Length; 

      if (equal) 
      { 
       for (var i = 0; i < ba2.Length; i++) 
       { 
        if (ba[i] != ba2[i]) 
        { 
         equal = false; 
         i = ba2.Length; 
        } 
       } 

      } 

      //equal is always false 
      //if (!equal) 
      //{ 
      // throw Exception("Stream is not valid"); 
      //} 
      //The code below will throw a Parameter is invalid exception 
      //System.Drawing.Image mediaObject = System.Drawing.Image.FromStream(memoryStream); 


      memoryStream.Close(); 
     } 

     public static void ReadFully(Stream input, out MemoryStream ms) 
     { 
      ms = new MemoryStream(); 
      byte[] buffer = new byte[16 * 1024]; 

      int read; 
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, read); 
      } 
     } 
     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 
    } 
} 
+2

Eso es lo que hace Ctrl + K + D en VS, ¡no he dedicado mucho tiempo a formatearlo para ser sincero! –

+2

@llnk nueva línea para C# es bastante estándar. Siempre me enseñaron a no escribir código "con acento", y Giuseppe sigue realmente las convenciones de código bastante estándar aquí. – Crisfole

Respuesta

5

En caso de que ayudó a otra persona, tengo el código para trabajo, esto es lo que ha cambiado:

public void ProcessRequest(HttpContext context) 
    { 
     if (context.Request.Files != null && context.Request.Files.Count > 0) 
     { 
      var file = context.Request.Files[0]; 

      file.SaveAs(@"C:\Users\giuseppe.JHP\Desktop\Image upload test\uploaded.gif"); 
     } 
    } 
+1

¡Más 1 para el código del lado del cliente! Eso es lo que no pude llegar a trabajar. – sreimer

Cuestiones relacionadas