MVC Valums Ajax Uploader - IE не отправляет поток в request.InputStream

Я использую Valums Ajax uploader. все отлично работает в Mozilla с помощью этого кода:

Вид:

var button = $('#fileUpload')[0];
var uploader = new qq.FileUploader({
    element: button,
    allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'], 
    sizeLimit: 2147483647, // max size
    action: '/Admin/Home/Upload',
    multiple: false
});

Контроллер:

public ActionResult Upload(string qqfile)
{
    var stream = Request.InputStream;
    var buffer = new byte[stream.Length];
    stream.Read(buffer, 0, buffer.Length);

    var path = Server.MapPath("~/App_Data");
    var file = Path.Combine(path, qqfile);
    File.WriteAllBytes(file, buffer);

    // TODO: Return whatever the upload control expects as response
}

на который был дан ответ в этом сообщении:

Загрузка файла MVC3 Valums Ajax

Однако проблема заключается в том, что это не работает в IE. Я нашел это, но я не могу понять, как его реализовать:

IE не отправляет поток в "request.InputStream"... вместо этого получить входной поток через HttpPostedFileBase из Коллекция Request.Files []

Кроме того, здесь, который показывает, как этот парень это сделал, но я не уверен, как изменить для моего проекта:

Загрузка файла Valum - работает в Chrome, но не в IE, изображение img = Image.FromStream(Request.InputStream)

//This works with IE
HttpPostedFileBase httpPostedFileBase = Request.Files[0]

как HttpPostedFileBase;

не может понять это. пожалуйста помоги! спасибо

Ответ 1

Я понял это. Это работает в IE и mozilla.

[HttpPost]
        public ActionResult FileUpload(string qqfile)
        {
            var path = @"C:\\Temp\\100\\";
            var file = string.Empty;

            try
            {
                var stream = Request.InputStream;
                if (String.IsNullOrEmpty(Request["qqfile"]))
                {
                    // IE
                    HttpPostedFileBase postedFile = Request.Files[0];
                    stream = postedFile.InputStream;
                    file = Path.Combine(path, System.IO.Path.GetFileName(Request.Files[0].FileName));
                }
                else
                {
                    //Webkit, Mozilla
                    file = Path.Combine(path, qqfile);
                }

                var buffer = new byte[stream.Length];
                stream.Read(buffer, 0, buffer.Length);
                System.IO.File.WriteAllBytes(file, buffer);
            }
            catch (Exception ex)
            {
                return Json(new { success = false, message = ex.Message }, "application/json");
            }

           return Json(new { success = true }, "text/html");
        }

Ответ 2

Решение Shane работает, но похоже, что Request [ "qqfile" ] все равно установлен в IE. Не уверен, что это связано с тем, что я использую обновленную версию файлового загрузчика, но я изменил инструкцию if, чтобы она работала для IE (проверяя, есть ли в запросе какие-либо загруженные файлы).

if (Request.Files.Count > 0) {
    //ie
} else {
    //webkit and mozilla
}

Вот полный фрагмент

[HttpPost]
public ActionResult FileUpload(string qqfile)
{
    var path = @"C:\\Temp\\100\\";
    var file = string.Empty;

    try
    {
        var stream = Request.InputStream;
        if (Request.Files.Count > 0)
        {
            // IE
            HttpPostedFileBase postedFile = Request.Files[0];
            stream = postedFile.InputStream;
            file = Path.Combine(path, System.IO.Path.GetFileName(Request.Files[0].FileName));
        }
        else
        {
            //Webkit, Mozilla
            file = Path.Combine(path, qqfile);
        }

        var buffer = new byte[stream.Length];
        stream.Read(buffer, 0, buffer.Length);
        System.IO.File.WriteAllBytes(file, buffer);
    }
    catch (Exception ex)
    {
        return Json(new { success = false, message = ex.Message }, "application/json");
    }

   return Json(new { success = true }, "text/html");
}