如何将文件从表单传递给HttpClient.PostAsync作为MultipartFormDataContent

时间:2018-01-04 16:36:43

标签: c# asp.net-mvc dotnet-httpclient httppostedfilebase

有一个允许用户上传文件的表单。没什么好看的。 文件被控制器捕获为 HttpPostedFileBase

然后从控制器将HttpPostedFileBase发送到想要使用HTTPClient将该文件转发到WEB API的服务。

我们正在使用client.PostAsync(url,content),其中内容为 MultipartFormDataContent ,其中使用IO FileRead(Stream)添加 StreamContent 。代码如下。

问题是来自HttpPostedFileBase的文件路径引用了用户本地机器路径,当服务器尝试读取它时,它失败并显示: 无法找到路径的一部分' C:\ Users .....'错误

尝试使用Server.MapPath进行处理,但在此过程中文件未保存到服务器(可能必须是?)

控制器

[HttpPost]
public ActionResult uploadFile(HttpPostedFileBase upload, int someID)
{
    FileUploadService.UploadFile(upload, someID);
    return RedirectToAction("Index");
}

服务

 public static bool UploadFile(HttpPostedFileBase file, int itemID)
    {
        using (var content = new MultipartFormDataContent())
        {
            Stream fs = File.OpenRead(file.FileName); //code fails on this line
            content.Add(CreateFileContent(fs, file.FileName, "text/plain"));

            client.DefaultRequestHeaders.Clear();
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));
            client.DefaultRequestHeaders.Add("Authorization-Token", token);

            var url = String.Format(.....'code removed not important this part is working' );

            var response = client.PostAsync(url, content).Result;
            response.EnsureSuccessStatusCode();
            if (response.IsSuccessStatusCode)
            {
                string responseString = response.Content.ReadAsStringAsync().Result;
                return true;
            }
            else
            {
                return false;
            }
        }
    }

private static StreamContent CreateFileContent(Stream stream, string fileName, string contentType)
    {
        try
        {
            var fileContent = new StreamContent(stream);
            fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data")
            {
                Name = "UploadedFile",
                FileName = "\"" + fileName + "\""
            };
            fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
            return fileContent;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

1 个答案:

答案 0 :(得分:2)

在发生故障的行上,您基本上是说要从服务器上的磁盘中打开文件,但是您还没有将其保存在那里。幸运的是,你不需要;您可以直接从HttpPostedFileBase获取流。

只需替换它:

Stream fs = File.OpenRead(file.FileName);
content.Add(CreateFileContent(fs, file.FileName, "text/plain"));

用这个:

content.Add(CreateFileContent(file.InputStream, file.FileName, "text/plain"));