如何从ASP.NET Web API(POST或PUT)调用中获取HttpPostedFile?

4

我的问题很简单。

我该如何从ASP.NET Web API的POST或PUT请求中获取HttpPostedFile?

我看到可以从请求中获取各种信息,例如Request.Header、Request.Content、Request.Properties。在其中哪里可以找到我传递的文件,以及如何从中创建HttpPostedFile?

谢谢!

2个回答

6
请查看Henrik Nielsen的优秀文章,以便了解如何发布多部分内容(例如发布带有文件的表单)。 更新:添加一个简单的控制器代码来接收没有多部分内容的文件。
如果您只需要控制器接收文件(即没有多部分内容),则可以像上面所述执行操作。请求仅包含文件二进制数据,文件名在URL中传递。
public Task<HttpResponseMessage> Post([FromUri]string filename)
{
    Guid uploadedFile = Guid.NewGuid();
    Task<HttpResponseMessage> task = Request.Content.ReadAsStreamAsync().ContinueWith<HttpResponseMessage>(t =>
         {
            if (t.IsFaulted || t.IsCanceled)
                throw new HttpResponseException(HttpStatusCode.InternalServerError);

            try
            {
                using (Stream stream = t.Result)
                {
                    //TODO: Write the stream to file system / db as you need
                }
            }
            catch (Exception e)
            {
                Object o = e;
                return Request.CreateResponse(HttpStatusCode.InternalServerError, e.GetBaseException().Message);
             }

            return Request.CreateResponse(HttpStatusCode.Created, uploadedFile.ToString());
         });


    return task;
}

1
@StijnSpijker - 已完成。回答已更新,附上代码示例。 - Julien Jacobs

5
抱歉,您的简短问题没有简短的答案。
ASP.NET Web API 使您接触到 HTTP 的奇妙之处,而 ASP.NET MVC 则在这种情况下为 HttpPostedFile 进行了抽象化。
因此,一些背景知识:涉及文件的 HTTP 帖子通常具有多部分表单数据内容。这意味着您正在混合不同类型的内容类型:您的普通表单数据将使用 formurlencoded 发送,而文件将以 application/octent-stream 发送。
因此,在 Web API 中,您只需说
var contents = message.Content.ReadAsMultipartAsync(); // message is HttpRequestMessage

其中一个内容将包含您的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接