【问题标题】:C# WebClient uploads file that is around twice as large as originalC# WebClient 上传的文件大约是原始文件的两倍
【发布时间】:2017-05-30 21:01:47
【问题描述】:

我正在使用 WebApi 2.0 测试一些文件上传。我创建了一个具有上传方法的控制器,还创建了一个控制台应用程序来执行上传。我的保存操作有问题,导致文件大约是原来的两倍?

下面的屏幕截图显示了我正在上传的文件,以及从服务器保存的文件。不要问为什么那个文件,我只是在我的下载文件夹中挑选了一些东西。

保存文件的服务器代码:

[RoutePrefix("api/Files")]
public class FileController : ApiController
{

    [Route("Upload")]
    public async Task<IHttpActionResult> UploadFileAsync()
    {


        await ReadStreamAsync(HttpContext.Current, @"C:\Users\Bailey Miller\Desktop\FTP\WebsiteUploads\" + Guid.NewGuid() + ".txt");

        return Ok();

    }

    private async Task<bool> ReadStreamAsync(HttpContext context, string filePath)
    {
        using (var reader = new StreamReader(context.Request.GetBufferlessInputStream(true)))
        using (var filestream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.Read, 4096, true))
        using (var writer = new StreamWriter(filestream))
        {
            var readBuffer = await reader.ReadToEndAsync();
            await writer.WriteAsync(readBuffer);
        }

        return true;
    }

}

上传文件的客户端代码:

static void Main(string[] args)
    {
        WebClient _client = new WebClient();

        _client.UploadFile("https://localhost:44314/api/Files/Upload", @"C:\Users\Bailey Miller\Downloads\AccessDatabaseEngine.exe");

        Console.WriteLine("Waiting .. .. ..");
        Console.ReadLine();
    }

【问题讨论】:

  • 您正在使用 StreamReaderStreamWriter - 为 text 设计的类 - 来处理看似二进制文件 (AccessDatabaseEngine.exe) 的内容。那简直是坏掉了。只需使用Stream 而不是StreamReader 和`StreamWriter`。
  • 你能发布一个更新版本的代码吗?

标签: c# asp.net-web-api file-transfer


【解决方案1】:

您不应该使用StreamReaderStreamWriter - 它们用于文本,并且您的内容不是文本。只需改用Stream

private async Task ReadStreamAsync(HttpContext context, string filePath)
{
    using (var input = context.Request.GetBufferlessInputStream(true))
    using (var output = File.Create(filePath))
    {
        await input.CopyToAsync(output);
    }
}

(我已将方法更改为只返回 Task,因为 bool 部分似乎毫无意义......)

【讨论】:

  • 我试过了,它只工作我的服务器文件比原来的大 1KB 保存还有什么奇怪的地方吗?
  • @BaileyMiller:嗯,我不知道GetBufferlessInputStream 是否真的是你应该在这里使用的——这只是取自你的帖子。你有什么理由不使用context.Request.Files[0].InputStream
  • 我正在关注另一篇文章中关于如何使用流而不是字节数组保存文件的示例。
  • 我认为差异实际上并不真实。磁盘上的大小相同,我认为可能是由于 GUID 导致的文件名长度。
  • @BaileyMiller:如果您之前说它“比原始文件大 1KB”,那么您是如何看待大小的?我建议您对这两个文件进行哈希处理,以更好地检查它们是否真的正确......
猜你喜欢
  • 2014-02-17
  • 1970-01-01
  • 2014-06-01
  • 2019-08-24
  • 2014-12-04
  • 2016-04-27
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多