【问题标题】:File Upload : ApiController文件上传:ApiController
【发布时间】:2015-09-17 19:06:15
【问题描述】:

我有一个使用 http post 请求使用 multipart/form-data 上传到我的类的文件,该类是从 ApiController 扩展的。

在一个虚拟项目中,我可以使用:

HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase 

在我的请求类型为System.Web.HttpRequestWrapper 的控制器方法中获取文件。

但在另一个生产应用程序中,我有不添加任何库/dll 的限制,我在 System.Web.HttpRequestWrapper 中看不到任何内容。

我的简单要求是获取发布的文件并将其转换为字节数组,以便能够将其存储到数据库中。

有什么想法吗?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-4 http asp.net-web-api


    【解决方案1】:

    此代码示例来自我之前做的一个 ASP.NET Web API 项目。它允许上传图像文件。我删除了与您的问题无关的部分。

    public async Task<HttpResponseMessage> Post()
    {
        if (!Request.Content.IsMimeMultipartContent())
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    
        try
        {
            var provider = await Request.Content.ReadAsMultipartAsync(new MultipartMemoryStreamProvider());
    
            var firstImage = provider.Contents.FirstOrDefault();
    
            if (firstImage == null || firstImage.Headers.ContentDisposition.FileName == null)
                return Request.CreateResponse(HttpStatusCode.BadRequest);
    
            using (var ms = new MemoryStream())
            {
                await firstImage.CopyToAsync(ms);
    
                var byteArray = ms.ToArray();
            }
    
            return Request.CreateResponse(HttpStatusCode.Created);
        }
        catch (Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex);
        }
    }
    

    【讨论】:

    • 它无法识别任何附加到它的文件。它没有比上面的这一行更进一步:if (firstImage == null || firstImage.Headers.ContentDisposition.FileName == null) 这是我用来发布文件的表格:&lt;form name="form1" method="post" enctype="multipart/form-data" action="api/upload3"&gt; &lt;fieldset&gt; &lt;input name="caption" type="text" /&gt; &lt;label for="image1"&gt;Image File&lt;/label&gt; &lt;input name="image1" type="file" /&gt; &lt;input type="submit" value="Submit" /&gt; &lt;/form&gt;
    • 成功了。我现在遇到了无法从定义为 multipart/form-data 的表单中捕获传递给我的字段的情况。
    • @user877247 - 很高兴听到这个答案对你有用。有了这个解决方案,将 byteArray 存储在数据库中应该只是少量的工作。
    • 有没有办法从我的 apicontroller 类的 post 方法中捕获表单变量?到目前为止,我所看到的解决方案正在扩展默认的 MultipartMemoryStreamProvider 行为。
    猜你喜欢
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2020-02-15
    相关资源
    最近更新 更多