Задать вопрос
wkololo_4ever
@wkololo_4ever

Как получить файл на ASP.NET MVC отправленный через XmlHttpRequest?

Есть код, который отправляет файл по адресу "/Home/Test"
var fileE = document.getElementById("fileAvatar");
    fileE.onchange = function ()
    {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "/Home/Test");
        xhr.send(this.files[0]);
    }

Как мне получить этот файл на стороне сервера?
Код метод действия
public JsonResult Test(HttpPostedFileBase fileAvatar)
        {
            return Json(new {status="OK" });
        }

не получает файл в переменную fileAvatar.
То бишь, как в JS указать, что этот файл должен идти в переменную fileAvatar?
UPD: решил созданием обьекта FormData. Есть ли другие решения?
  • Вопрос задан
  • 4169 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 2
@marksimon221
try this

public JsonResult UploadPure()
{
string fileName = Request.Headers["X-File-Name"];
string fileType = Request.Headers["X-File-Type"];
int fileSize = int.Parse(Request.Headers["X-File-Size"]);
System.IO.Stream fileContent = Request.InputStream;
System.IO.FileStream fileStream = System.IO.File.Create(Server.MapPath("~/") + fileName);
fileContent.Seek(0, System.IO.SeekOrigin.Begin);
fileContent.CopyTo(fileStream);
fileStream.Dispose();

return Json("Uploaded files");
}
it's work for me , for more info: www.agileinfoways.com/technical-expertise/ms-techn...
Ответ написан
Комментировать
@Nokia7650
web developer
Автор, если вы решили через FormData, то почему не выложили решение? Сэкономили бы кучу времени мне и другим джуниорам.

По вашему решению:

во вьюшке, js:
var fileE = document.getElementById("inputID");
        fileE.onchange = function () {
            var xhr = new XMLHttpRequest();
            xhr.open("POST", "/Home/Index");
            xhr.send(this.files[0]);
        }


В контроллере:

[HttpPost]
        public JsonResult Index(HttpPostedFileBase fileAvatar)
        {
            var ggg = Request.BinaryRead(Request.ContentLength);
            // Запись на диск
            System.IO.File.WriteAllBytes(@"C:\1.jpg", ggg);
           // или в Bitmap
            var originalImage = ConvertToBitmap(ggg);
            var d = originalImage;

            return null;
        }

private static Bitmap ConvertToBitmap(byte[] imagesSource)
        {
            var imageConverter = new ImageConverter();
            var image = (Image)imageConverter.ConvertFrom(imagesSource);
            return new Bitmap(image);
        }


Через FormData:

js:
var fileE = document.getElementById("inputID");
        fileE.onchange = function () {
            var xhr = XMLHttpRequest();
            var data = new FormData;
            data.append("image", this.files[0]);
            xhr.open("POST", "/Home/Index");
            xhr.send(data);
        }


Контроллер:
[HttpPost]
        public ActionResult Index(HttpPostedFileBase image)
        {
            var originalImage = new Bitmap(image.InputStream, false);

            return null;
        }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы