最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - Saving javascript image blob to ASP.NET Core Controller - Stack Overflow

programmeradmin2浏览0评论

Good day,

I'm trying to send a javascript blob image to my controller method in ASP.NET Core but it doesn't go to my controller.

I have an image from my canvas and it's dataUri to be able to convert it to javascript blob, I'm using this code:

dataURItoBlob(dataURI) {
// convert base64 to raw binary data held in a string
// doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
var byteString = atob(dataURI.split(',')[1]);

// separate out the mime ponent
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]

// write the bytes of the string to an ArrayBuffer
var ab = new ArrayBuffer(byteString.length);

// create a view into the buffer
var ia = new Uint8Array(ab);

// set the bytes of the buffer to the correct values
for (var i = 0; i < byteString.length; i++) {
    ia[i] = byteString.charCodeAt(i);
}

// write the ArrayBuffer to a blob, and you're done
var blob = new Blob([ab], { type: mimeString });
return blob;
}

// Then in my save method here are my javascript codes:
const fileImage = this.dataURItoBlob(myDataUriImage);

axios.post(`Info/Create`, fileImage , {
headers: {
    "Content-Type": "multipart/form-data"
    }
})

Here is my simple ASP.NET Core controller method

public async Task<IActionResult> Create([FromBody]IFormFile fileImage)
{
 ...
}

Any help please?

Good day,

I'm trying to send a javascript blob image to my controller method in ASP.NET Core but it doesn't go to my controller.

I have an image from my canvas and it's dataUri to be able to convert it to javascript blob, I'm using this code:

dataURItoBlob(dataURI) {
// convert base64 to raw binary data held in a string
// doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
var byteString = atob(dataURI.split(',')[1]);

// separate out the mime ponent
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]

// write the bytes of the string to an ArrayBuffer
var ab = new ArrayBuffer(byteString.length);

// create a view into the buffer
var ia = new Uint8Array(ab);

// set the bytes of the buffer to the correct values
for (var i = 0; i < byteString.length; i++) {
    ia[i] = byteString.charCodeAt(i);
}

// write the ArrayBuffer to a blob, and you're done
var blob = new Blob([ab], { type: mimeString });
return blob;
}

// Then in my save method here are my javascript codes:
const fileImage = this.dataURItoBlob(myDataUriImage);

axios.post(`Info/Create`, fileImage , {
headers: {
    "Content-Type": "multipart/form-data"
    }
})

Here is my simple ASP.NET Core controller method

public async Task<IActionResult> Create([FromBody]IFormFile fileImage)
{
 ...
}

Any help please?

Share Improve this question asked Jul 6, 2018 at 4:57 jsonGPPDjsonGPPD 1,0375 gold badges17 silver badges32 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 2

To post a file via AJAX, you need the FormData JS class.

var formData = new FormData();
formData.append('fileImage', fileImage);

Then, you submit formData instead of fileImage as the data in your post.

Bear in mind that submitting a file via AJAX requires HTML5, which therefore requires a modern browser. That doesn't seem to be an issue as you're already making heavy use of the File API, which is also HTML5. Just be aware that none of this is going to work in something like IE10 or less.

Also, this is only for requests with a multipart/form-data mime type, as you're using here. For reference, if you want to send JSON, the file needs to be encoded as a Base64 string and sent as just another member of the JSON object. On the server-side, you then need to bind to byte[] instead of IFormFile.

<html>
<head>
    <style>
        .fs-upload-target {
            background: #fff;
            border: 3px dashed #607d8b;
            border-radius: 2px;
            color: #455a64;
            font-size: 14px;
            margin: 0;
            padding: 25px;
            text-align: center;
            -webkit-transition: background .15s linear,border .15s linear,color .15s linear,opacity .15s linear;
            transition: background .15s linear,border .15s linear,color .15s linear,opacity .15s linear;
        }

        img {
            width: 100%;
            height: auto;
        }
    </style>

    <script>
        function openDialogue() {
            document.getElementById('upload_file').click();
        }
        function preview_image() {
            var total_file = document.getElementById("upload_file").files.length;
            for (var i = 0; i < total_file; i++) {
                $('#image_preview').append("<div class='col-md-3'><img src='" + URL.createObjectURL(event.target.files[i]) + "'></div>");
            }
        }
    </script>
</head>
<body>
    <div>
        <form action="upload_file.php" method="post" enctype="multipart/form-data">
            <input type="file" id="upload_file" name="upload_file[]" style="display:none" accept="image/*" onchange="preview_image();" multiple />
            <div id="dropTarget" onclick="openDialogue()" class="fs-upload-target">
                Drop some files here
            </div>
        </form>
        <div class="form-group">
            <div id="image_preview" class="table img-responsive table-responsive"></div>
        </div>
    </div>
</body>
</html>

发布评论

评论列表(0)

  1. 暂无评论