javascript - 通过ajax发送字节数组

标签 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有值,但是当我调试并在 Controller 中查看它时,它是 NULL。

这是我的 Controller 。

[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);
    }
}

最佳答案

您使用 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. 如果您要发送图像,最简单的方法是使用multipart/form-dataContent-Type 同时在服务器端使用 IFormFile

    // 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 () {
                // ...
            }
        });
    }
    

关于javascript - 通过ajax发送字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55931969/

相关文章:

javascript - 这里看不到警报。原因可能是什么?

javascript - 如何获取 Bootstrap 模式的数据并发送 PHP

javascript - 通过 ajax 将 javascript 变量(字符串)传递给 Controller ​​ - 404

javascript - 谷歌浏览器是否有可用的代理对象 polyfill?

javascript - 永远停止 Node js

javascript - 从 JS 脚本创建一个可嵌入的 "widget"

javascript - jQuery/JavaScript插件,用于突出显示文本

c# - 带有自定义 header 的 Ajax 请求发送到启用了 CORS 的 Web API 服务器

javascript - 如何确定浏览器 session 是刚刚开始还是后续点击?

javascript - 使用 JQuery 更改显示不起作用