【问题标题】:sending binary file byte array to web api method将二进制文件字节数组发送到 web api 方法
【发布时间】:2018-09-26 11:39:36
【问题描述】:

我需要以 JSON 或字节数组的格式将大小为 100MB 的二进制文件发布到 Web API 1.1。 我的客户端应用程序是具有 x32 位架构的 C# winforms 应用程序。我想从这个客户端应用程序读取二进制文件并将这个二进制文件字节数组发送到 Web API。

我的 winforms 应用程序中的当前实现如下

var sFile = @"C"\binary.zip";
var mybytearray = File.ReadAllBytes(sFile);
var webRequest =
                (HttpWebRequest)WebRequest.Create("http://localhost/filewriter");
webRequest.ContentType = "text/plain";
webRequest.Method = WebRequestMethods.Http.Post;
webRequest.AllowWriteStreamBuffering = true;
webRequest.Timeout = 100000;
webRequest.Headers.Add("fileName", Path.GetFileName(sFile));
webRequest.ContentLength = mybytearray.Length;

using (var dataStream = new StreamWriter(webRequest.GetRequestStream()))
      dataStream.Write(mybytearray);

using (var response = webRequest.GetResponse())
{
    if(response.StatusCode = HttpStatusCode.Ok;
         return true;
}

下面是我的Web api方法写的

[HttpPost]
public HttpResponseMessage filewriter(byte[] binaryData)
{
    using (FileStream binaryFileStream = new FileStream("C:\\myNewFile.zip", FileMode.Create, FileAccess.ReadWrite))
          {
              binaryFileStream.Write(binaryData, 0, binaryData.Length);
          }
}

如您所见,在上面的代码中,我无法将字节数组发送到 web api 方法文件编写器。我是否错过了在这种情况下应该起作用的东西。

正如我所说的其他方式,我尝试过相同的方式,但不是使用 Json 的字节数组,如下所示

var sFile = @"C"\binary.zip";   
var mybytearray = File.ReadAllBytes(sFile);
var mymodel = new model
{
    fileName = sFile,
    binaryData = mybytearray
};

var jsonResendObjects = JsonConvert.SerializeObject(mymodel);
var webRequest = (HttpWebRequest)WebRequest.Create("http://localhost/filewriter");
webRequest.ContentType = "application/json";
webRequest.Method = WebRequestMethods.Http.Post;
webRequest.AllowWriteStreamBuffering = true;
webRequest.Timeout = 100000;
webRequest.Headers.Add("fileName", Path.GetFileName(sFile));
webRequest.ContentLength = jsonResendObjects.Length;
byte[] responseData = null;

webRequest.AllowWriteStreamBuffering = true;
using (var dataStream = new StreamWriter(webRequest.GetRequestStream()))
    dataStream.Write(jsonResendObjects);

在 web api 方面

[HttpPost]
public HttpResponseMessage filewriter([FromBody]model mymodel)
{
    using (FileStream binaryFileStream = new FileStream("C:\\myNewFile.zip", FileMode.Create, FileAccess.ReadWrite))
          {
              binaryFileStream.Write(mymodel.binarydata, 0, binaryDatabinarydat.Length);
          }
}

【问题讨论】:

  • stefan,这不是上传文件,我想上传字节,在 web api 方法上应该将字节写入文件
  • 你查过link的解决方案了吗,我觉得很像

标签: c# winforms asp.net-web-api httpwebrequest


【解决方案1】:

在我看来,使用 base64 编码很容易 交流。

如果你想这样做

首先,将文件转换为 byte[],然后转换为 base64 字符串

像这样:

byte[] bytes = File.ReadAllBytes("path");
string file = Convert.ToBase64String(bytes);
// You have base64 Data in "file" variable

在您的 WebAPI 端点上接受字符串

[HttpPost]
public HttpResponseMessage filewriter(string fileData)
{
}

然后将你的 base64 字符串转换回 byte[] 并将其写入文件或任何你想用它做的事情。

像这样:

// put your base64 string in b64str
Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);

你可以像这样使用 GZIP 压缩你的字符串

public static void CopyTo(Stream src, Stream dest) {
    byte[] bytes = new byte[4096];

    int cnt;

    while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0) {
        dest.Write(bytes, 0, cnt);
    }
}

public static byte[] Zip(string str) {
    var bytes = Encoding.UTF8.GetBytes(str);

    using (var msi = new MemoryStream(bytes))
    using (var mso = new MemoryStream()) {
        using (var gs = new GZipStream(mso, CompressionMode.Compress)) {
            //msi.CopyTo(gs);
            CopyTo(msi, gs);
        }

        return mso.ToArray();
    }
}

public static string Unzip(byte[] bytes) {
    using (var msi = new MemoryStream(bytes))
    using (var mso = new MemoryStream()) {
        using (var gs = new GZipStream(msi, CompressionMode.Decompress)) {
            //gs.CopyTo(mso);
            CopyTo(gs, mso);
        }

        return Encoding.UTF8.GetString(mso.ToArray());
    }
}

参考:-

Convert file to base64 and back

GZip Compression

【讨论】:

  • Mihir,如果我们将 100 MB 文件字节转换为 base64,我知道 base64 会消耗更多内存,并且我的 winforms 客户端应用程序被编写为具有 32 位架构,并且已经加载了其他组件.如您所知,操作系统仅允许 1.8GB 到 32 位应用程序。
  • @CSharpDev 你用过 Gzip 压缩吗?它可以创造奇迹。最近的浏览器和服务器使用这种技术进行压缩。检查我更新的答案,试一试压缩,看看它对你的文件大小有多大影响,这基本上是在压缩文件后传输你的文件。
  • @CSharpDev 如果您不进行将由用于传输的 http 协议完成的 base64 转换,因为 http 无法在不转换为 base 64 之类的格式的情况下传输二进制数据。
  • 说得好@DanielW。
  • 我只是觉得有必要说你救了我的命 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2016-10-02
相关资源
最近更新 更多