2012-03-06 1 views
6

Я пытаюсь отлаживать асинхронный загрузчик файлов, который я создал некоторое время назад, который больше не работает, я потратил уже много времени без успеха.Загрузка асинхронного файла HTML5, загруженный поток всегда недействителен

Поток, который получает сервер, всегда поврежден на самом деле, файл (изображение), который я сохраняю, не может быть открыт.

Чтобы упростить отладку, я настроил новый проект ASP.NET с двумя основными файлами, HTML-файлом с полем формы и обработчиком ASP.NET.

Несмотря на то, что код здесь очень тривиален, мне все еще не повезло! :(

Любая помощь высоко ценится, большое спасибо

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

и вот обработчик 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

Это то, что делает Ctrl + K + D в VS, я не трачу много времени, чтобы отформатировать его дальше, если честно! –

+2

@llnk новая линия для C# довольно стандартная. Меня всегда учили не писать код «с акцентом», а Джузеппе действительно придерживается довольно стандартных условных условных обозначений. – Crisfole

ответ

5

В случае помог кто-то другой, я получил код работа, вот что он изменил:

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

Плюс 1 для кода на стороне клиента! Это то, что я не мог заставить работать. – sreimer

 Смежные вопросы

  • Нет связанных вопросов^_^