2012-03-06 15 views
6

Sto cercando di eseguire il debug di un uploader di file asincrono che ho costruito qualche tempo fa, che non funziona più, ho passato già un bel po 'di tempo senza successo.HTML5 upload di file asincrono, flusso caricato è sempre valida

Il flusso che il server sta ricevendo è sempre danneggiato in realtà il file (immagine) che risparmio non può essere aperto.

Per semplificare il debugging Ho installato un nuovo progetto ASP.NET, con due file principali, il file HTML con il campo di modulo e il gestore ASP.NET.

Nonostante il codice qui essendo molto banale, io sono ancora fuori di fortuna! :(

Ogni aiuto è molto apprezzato, molte grazie

<!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> 

ed ecco il gestore 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

Questo è ciò che fa un Ctrl + K + D in VS, non ho trascorso molto tempo per formattarlo ulteriormente per essere onesto! –

+2

@llnk la nuova riga per C# è piuttosto standard. Mi è sempre stato insegnato a non scrivere il codice "Con accento", e Giuseppe sta seguendo le convenzioni di codice piuttosto standard qui. – Crisfole

risposta

5

Nel caso in cui ha aiutato qualcun altro, ho il codice per lavoro, ecco cosa è cambiato:

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

Più 1 per il codice lato client! Questo è quello che non potrei arrivare a lavorare. – sreimer

Problemi correlati