Асинхронная загрузка файла 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;
            }
        }
    }
}
6
задан Giuseppe Romagnuolo 7 March 2012 в 11:57
поделиться