c# - 将二进制文件字节数组发送到 web api 方法

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

我需要将大小为 100MB 的二进制文件以 JSON 或字节数组的格式发布到 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);

在网络 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);
          }
}

最佳答案

According to me, it would be easy to use base64 encoding for communication.

如果你想这样做

首先,将你的文件转换成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);

And you can Compress your string Using GZIP Like this

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

关于c# - 将二进制文件字节数组发送到 web api 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52516886/

相关文章:

C#:从泛型类型名称中获取 XML 元素名称的最佳方式

c# - c#中的一些数字、日期和电话号码使用什么数据类型?

c# - 单声道下的 FileSystemWatcher - 监视子目录

c# - 停靠的多行文本框被 StatusStrip 覆盖

c# - 我怎样才能使这段代码更优化

c# - PropertyGrid.BrowsableAttributes 有什么用?

c# - 在 winforms 中嵌入用户可自定义的 richtext 或 html

c# - 使用 Fiddler POST 测试 WebApi

c# - 是否可以在 ASP.NET Web API 中的模型/DTO 上定义路由(类似于 ServiceStack)?

c# - ASP.net MVC 4 WebApi - 测试 MIME 多部分内容