C# WebClient 上传的文件大约是原始文件的两倍
C# WebClient uploads file that is around twice as large as original
我正在使用 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();
}
您不应该使用 StreamReader
和 StreamWriter
- 它们用于 text,并且您的内容不是文本。只需使用 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);
}
}
(我已将方法更改为 return Task
,因为 bool
部分似乎毫无意义...)
我正在使用 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();
}
您不应该使用 StreamReader
和 StreamWriter
- 它们用于 text,并且您的内容不是文本。只需使用 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);
}
}
(我已将方法更改为 return Task
,因为 bool
部分似乎毫无意义...)