我使用Owin和Katana自我托管的网络API。我想从示例客户端发送文件(可能很大,几百MB),并希望将这些文件保存在服务器的磁盘上。目前只在本地计算机上测试服务器。
我在测试客户端的机器上有以下内容(它在这里显示图像,但它并不总是图像):
using System;
using System.IO;
using System.Net.Http;
class Program
{
string port = "1234";
string fileName = "whatever file I choose will be here";
static void Main(string[] args)
{
string baseAddress = "http://localhost:" + port;
InitiateClient(baseAddress);
}
static void InitiateClient(string serverBase)
{
Uri serverUri = new Uri(serverBase);
using(HttpClient client = new HttpClient())
{
client.BaseAddress = serverUri;
HttpResponseMessage response = SendImage(client, fileName);
Console.WriteLine(response);
Console.ReadLine();
}
}
private static HttpResponseMessage SendImage(HttpClient client, string imageName)
{
using (var content = new MultipartFormDataContent())
{
byte[] imageBytes = System.IO.File.ReadAllBytes(imageName);
content.Add(new StreamContent(new MemoryStream(imageBytes)), "File", "samplepic.png");
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("multipart/form-data"));
return client.PostAsync("api/ServiceA", content).Result;
}
}
首先,这是使用POST发送文件的正确方法吗?
现在这里是我真正迷失的地方。我不知道如何保存我在ServiceAController的Post方法中接收的文件,该方法继承了ApiController。我看到其他一些使用HttpContext.Current的例子,但由于它是自托管的,它似乎是空的。
答案 0 :(得分:0)
我会在上传之前将文件拆分成块。对于单个HTTP POST请求,100 Mb有点大。大多数Web服务器对HTTP请求大小也有一定的限制。
通过使用块,如果连接超时,则无需再次重新发送所有数据。
答案 1 :(得分:0)
无论您使用自托管还是IIS,无论是图像文件还是任何类型的文件都无关紧要。
您可以查看我的答案,为您提供简单的代码
https://stackoverflow.com/a/10765972/71924
关于大小,如果可能的话,最好是块,但这会为您的客户提供更多的工作(除非您也拥有API客户端代码),并且您必须在服务器上为您重建文件。
这将取决于所有文件是否超过100MB或只有少数。如果它们一直很大,我建议寻找http字节范围支持。这是http标准的一部分,我相信你可以找到使用WebAPI实现它的人