代码之家  ›  专栏  ›  技术社区  ›  Miamy Dan Barrett

如何正确编写从webapi接收的文件

  •  2
  • Miamy Dan Barrett  · 技术社区  · 7 年前

    我尝试制作一个简单的webapi来从服务器接收文件。

    以下是服务器部分:

    var result = new HttpResponseMessage(HttpStatusCode.OK);
    var stream = new FileStream(itemPath, FileMode.Open, FileAccess.Read);
    result.Content = new StreamContent(stream);
    result.Content.Headers.ContentType = 
          new MediaTypeHeaderValue("application/octet-stream");
    result.Content.Headers.ContentDisposition = 
          new ContentDispositionHeaderValue("attachment") { FileName = itemPath };
    return result;
    

    客户方:

    var client = new HttpClient();
    var responce = Task.Run(() => client.GetAsync(@"https://localhost:...")).Result;
    var bytes = Task.Run(() => responce.Content.ReadAsByteArrayAsync()).Result;
    var writer = 
      new BinaryWriter(new FileStream(fileName, FileMode.CreateNew, FileAccess.Write));
    writer.Write(bytes);
    writer.Close();
    

    以及书面文件内容:

    {"version":{"major":1,"minor":1,"build":-1,"revision":-1,"majorRevision":-1,
    "minorRevision":-1},"content":{"headers":[{"key":"Content-Type","value":["application/octet-stream"]},{"key":"Content-Disposition",
    "value":["attachment; filename=\"=?utf-8?B?ZDpcTGlicmFyeVBhdGhc0J/QsNGH0LXQutC+XEV4YW1wbGUgR
    DVcQ2QxN1xDTElQQlJEXE1haW5Gcm0ucGFz?=\""]}]},"statusCode":200,
    "reasonPhrase":"OK","headers":[],"requestMessage":null,"isSuccessStatusCode":true}
    

    我希望这个文件将包含一个来自服务器本身的文件,但不包含描述它的JSON。

    我错过了什么?

    1 回复  |  直到 7 年前
        1
  •  6
  •   Nkosi    7 年前

    响应的内容不应该是 HttpResponseMessage .

    Asp.net核心Web API正在读取 Http响应消息

    重构服务器端代码以在控制器中使用建议的语法

    public IActionResult MyAction(...) {
        //...
        var stream = new FileStream(itemPath, FileMode.Open, FileAccess.Read);
        return File(stream, "application/octet-stream", "desired file name here");
    }
    

    返回一个 IActionResult 派生 FileStreamResult

    .Result . 还不清楚为什么异步调用被包装在 Task.Run 当他们已经可以等待的时候。

    始终保持代码异步

    var client = new HttpClient();
    var response = await client.GetAsync(@"https://localhost:..."); ;
    var bytes = await response.Content.ReadAsByteArrayAsync();
    var fileName = response.Content.Headers.ContentDisposition.FileName;
    using (var stream = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write)) {
        await stream.WriteAsync(bytes, 0, bytes.Length);
    }
    

    var client = new HttpClient();
    var response = await client.GetAsync(@"https://localhost:..."); ;
    var stream = await response.Content.ReadAsStreamAsync();
    var fileName = response.Content.Headers.ContentDisposition.FileName;
    using (var fileStream = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write)) {
        await stream.CopyToAsync(fileStream);
    }