C# HttpClient:如何一次上载多个文件

C# HttpClient:如何一次上载多个文件,c#,file-upload,.net-4.5,dotnet-httpclient,C#,File Upload,.net 4.5,Dotnet Httpclient,我正在尝试使用上载多个文件 这只发送multipart/form数据,但我希望文章中的某个地方有multipart/mixed 更新:好的,我四处看看 using (var content = new MultipartFormDataContent()) { var mixed = new MultipartContent("mixed") { CreateFileContent(imageStream, "image.jpg", "image/jpeg"),

我正在尝试使用上载多个文件

这只发送multipart/form数据,但我希望文章中的某个地方有multipart/mixed

更新:好的,我四处看看

using (var content = new MultipartFormDataContent())
{
    var mixed = new MultipartContent("mixed")
    {
        CreateFileContent(imageStream, "image.jpg", "image/jpeg"),
        CreateFileContent(signatureStream, "image.jpg.sig", "application/octet-stream")
    };

    content.Add(mixed, "files");

    var response = await httpClient.PostAsync(_profileImageUploadUri, content);
    response.EnsureSuccessStatusCode();
}

private StreamContent CreateFileContent(Stream stream, string fileName, string contentType)
{
    var fileContent = new StreamContent(stream);
    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("file") {FileName = fileName};
    fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
    return fileContent;
}
这在wire shark上看起来是正确的。但我在控制器中看不到文件

[HttpPost]
public ActionResult UploadProfileImage(IEnumerable<HttpPostedFileBase> postedFiles)
{
    if(postedFiles == null)
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

    // more code here
}
[HttpPost]
public ActionResult UploadProfileImage(IEnumerable postedFiles)
{
if(postedFiles==null)
返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest);
//这里有更多代码
}

postedFiles
仍然为空。有什么想法吗?

很好。但这种行为很奇怪

using (var content = new MultipartFormDataContent())
{
    content.Add(CreateFileContent(imageStream, "image.jpg", "image/jpeg"));
    content.Add(CreateFileContent(signatureStream, "image.jpg.sig", "application/octet-stream"));

    var response = await httpClient.PostAsync(_profileImageUploadUri, content);
    response.EnsureSuccessStatusCode();
}

private StreamContent CreateFileContent(Stream stream, string fileName, string contentType)
{
    var fileContent = new StreamContent(stream);
    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") 
    { 
        Name = "\"files\"", 
        FileName = "\"" + fileName + "\""
    }; // the extra quotes are key here
    fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);            
    return fileContent;
}

[HttpPost]
public ActionResult UploadProfileImage(IList<HttpPostedFileBase> files)
{
    if(files == null || files.Count != 2)
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

    // more code
}
使用(var content=new MultipartFormDataContent())
{
添加(CreateFileContent(imageStream,“image.jpg”,“image/jpeg”);
添加(CreateFileContent(signatureStream,“image.jpg.sig”,“application/octet-stream”);
var response=wait httpClient.PostAsync(_profileImageUploadUri,content);
response.EnsureSuccessStatusCode();
}
私有StreamContent CreateFileContent(流、字符串文件名、字符串内容类型)
{
var fileContent=新的流内容(流);
fileContent.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“表单数据”)
{ 
Name=“\”文件\“”,
FileName=“\”“+FileName+”\“”
};//额外的引号在这里很重要
fileContent.Headers.ContentType=新的MediaTypeHeaderValue(ContentType);
返回文件内容;
}
[HttpPost]
public ActionResult UploadProfileImage(IList文件)
{
if(files==null | | files.Count!=2)
返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest);
//更多代码
}

哇,你真是个天才。工作得很好@科克沃尔,谢谢。事实上,我最近在使用Xamarin时遇到了一个问题,因为它在添加额外的引号时失败了。因此,我必须编写自己的MultipartFormDataContentclass@esskar服务器端代码是什么样子的?我无法让它工作。为了将来的参考,如果有人无法让它在其他后端服务器(如Laravel或Express)中工作,只需将数组
[]
添加到
Name=“\”files\”
=>
Name=“\”files[]\”
这个问题我已经解决了好几个小时。什么
FileStream,记忆之流,什么?可悲的是,我也遇到了这个问题:
using (var content = new MultipartFormDataContent())
{
    content.Add(CreateFileContent(imageStream, "image.jpg", "image/jpeg"));
    content.Add(CreateFileContent(signatureStream, "image.jpg.sig", "application/octet-stream"));

    var response = await httpClient.PostAsync(_profileImageUploadUri, content);
    response.EnsureSuccessStatusCode();
}

private StreamContent CreateFileContent(Stream stream, string fileName, string contentType)
{
    var fileContent = new StreamContent(stream);
    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") 
    { 
        Name = "\"files\"", 
        FileName = "\"" + fileName + "\""
    }; // the extra quotes are key here
    fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);            
    return fileContent;
}

[HttpPost]
public ActionResult UploadProfileImage(IList<HttpPostedFileBase> files)
{
    if(files == null || files.Count != 2)
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

    // more code
}