通过C#PhysicalFile通过json发送binairy数据会导致字符编码丢失

时间:2018-10-31 14:34:13

标签: javascript c# vue.js encoding character-encoding

我有一个二进制文件,希望通过ajax调用将其发送回网站。为此,我有以下代码:

[Microsoft.AspNetCore.Mvc.Route("api/BIM/GetModifiedRevitFile")]    
public ActionResult GetModifiedRevitFile(string json)
{
    string tmppath = Path.GetTempPath();
     var fileVirtualPath = tmppath + "result.rvt";
    WorkItemHandler.ExecuteWorkItem(fileVirtualPath);
    var res= PhysicalFile(fileVirtualPath, "application/octet-stream", Path.GetFileName(fileVirtualPath));

        return res;

和vue / javascript代码:

AskToStoreFile: function (file, self) {
    alert("asking stuff")
    alert(file.responseText);
    var saveByteArray = (function () {
        var a = document.createElement("a");
        document.body.appendChild(a);
        a.style = "display: none";
        return function (data, name) {
            var blob = new Blob(data, { type: "octet/stream" }),
                url = window.URL.createObjectURL(blob);
            a.href = url;
            a.download = name;
            a.click();
            window.URL.revokeObjectURL(url);
        };
    }());

    saveByteArray([file.responseText], 'example.dat');
},

UploadLightsToServer: function() {
    var self = this;

    $.ajax({
        type: "GET",
        timeout: 12000000,
        url: 'api/BIM/GetModifiedRevitFile',
        contentType: "application/octet-stream"
        dataType: "application/octet-stream",
        success: function (data) {
            self.AskToStoreFile(data, self);
        },
        error: function (data) {
            self.AskToStoreFile(data,self)
            alert("failed to load data" + JSON.stringify(data));
        }
    });
},

StoreLightsInRevit: function() {
    alert("doing a revit");
    this.UploadLightsToServer();
},

现在,此代码以大多数正确的格式发送文件,但是有很多宾利字符,例如

  

ÐÏࡱá

成为

  

��ࡱ�

我知道这可能是某种编码问题,但是我不知道如何解决。

1 个答案:

答案 0 :(得分:1)

正如评论中指出的那样,JQuery的ajax似乎没有标准的blob支持。

但是它确实允许您修改XHR请求。

此链接显示更多详细信息-> Using jQuery's ajax method to retrieve images as a blob

为简单起见,在此处剪切和粘贴少量内容。

jQuery.ajax({
  url:....,
  xhrFields:{
    responseType: 'blob'
  },
  ...
});