通过ajax发送字节数组

时间:2019-05-01 05:26:34

标签: javascript jquery ajax asp.net-core

我收到的ajax请求仅在一半时有效。

function receivedText() {
    alert(fr.result); //Here i have good result
    $.ajax({
        type: "POST",
        url: "/Gallery/UploadImage",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: {
            byteArray: fr.result,
            fileName: $('input[type=file]').val().split('\\').pop()
        },
        success: function (data) {
            if (data == 0)
                alert("error");
            else
                alert("Success");
        },
        error: function () {
            alert("ERROR");
        }
    });
}

这是我的要求。如您所见,我在那里评论说,在我的测试(警报)fr.result中,当我调试并在控制器中看到它时,它的值为BUT,它为NULL。

这是我的控制者。

[HttpPost]
public IActionResult UploadImage(byte[] byteArray, string fileName)
{
    try
    {
        System.IO.File.WriteAllBytes(_hostingEnvironment.WebRootPath + "\\Uploads\\Images\\" + fileName, byteArray);
        return Json(0);
    }
    catch
    {
        return Json(0);
    }
}

2 个答案:

答案 0 :(得分:1)

您以错误的方式使用ajax。

  1. 第一个错误是Content-Type不匹配

    $.ajax({
        ...
        contentType: "application/json; charset=utf-8",
        ...
        data: {
            byteArray: fr.result,
            fileName: $('input[type=file]').val().split('\\').pop()
        },
        ...
    } 
    

    尽管已设置Content-Type=application/json,但默认情况下,发送到服务器的有效负载为form-url-encoded

    fileName=Xyz&byteArray=
    

    如果需要JSON格式,则应使用 JSON.stringify({...}) 获得文本表示形式。

  2. contentType: "application/json;在这里不合适。那是因为:

    • JSON并非用于处理二进制数据,而是用于文本。您无法使用json发送byte[]
    • 服务器端代码期望查询/路由/表单中的简单类型。如果您需要json,它们应该类似于IActionResult UploadImage([FromBody] Fr fr)
  3. 如果要发送图像,最简单的方法是将 Content-Type 中的multipart/form-data IFormFile < / strong>同时在服务器端。

    // action method
    public IActionResult UploadImage(IFormFile image, string fileName)
    {
         // ...
    }
    

    现在您可以发送FormData了:

    // your receivedText() function
    function receivedText(){
        var formData = new FormData();
        formData.append('fileName', 'Xyz.img');
    
        // if you need upload image
        var inputFileElement=document.getElementById("inputFileImage");
        formData.append('image', inputFileElement.files[0]);
    
        // of if you're already have a `byte[]`, you could do it as below:
        // var blob = new Blob([bytearray]...); // see https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob
        // formData.append('image', blob); 
    
        $.ajax({
            type: "POST",
            url: "/Gallery/UploadImage",
            contentType: false,
            processData: false,
            data: formData,
            success: function (data) {
                console.log(data);
                // ...
            },
            error: function () {
                // ...
            }
        });
    }
    

答案 1 :(得分:1)

那是你的主意:

public class UploadImageBindings {
   public string byteArray {get;set;}
   public string fileName {get;set;}
}

[HttpPost]
public IActionResult UploadImage(UploadImageBindings bindings)
{
    try
    {
     var bytes = System.Text.Encoding.UTF8.GetBytes(bindings.byteArray);
        System.IO.File.WriteAllBytes(_hostingEnvironment.WebRootPath + "\\Uploads\\Images\\" + bindings.fileName, bytes);
        return Json(0);
    }
    catch
    {
        return Json(0);
    }
}

您的问题是您没有以byte[]的身份发布,而是必须以字符串的形式发布!