c# - Request.Content.IsMimeMultipartContent() 失败

标签 c# asp.net-web-api http-post

我正在尝试使用 Html2 input type="file"和 angular2 http.post 请求上传文件。当请求到达 web api 时,它在

Request.Content.IsMimeMultipartContent()

当使用 Postman 提交请求时,它不会失败(当我不在 header 中包含 Content-Type 时,因为 postman 会处理它)。

查看我的代码: HTML:

 <input type="file" (change)="fileChange($event)" placeholder="Upload file" accept=".pdf,.doc,.docx,.dwg,.jpeg,.jpg">

服务功能:

uploadFile(event) {
    let fileUploadUrl = this.webApiFileUploadURL;
    let fileList: FileList = event.target.files;
    if(fileList.length > 0) {
        let file: File = fileList[0];
        let formData:FormData = new FormData();
        formData.append('uploadFile', file, file.name);
        let headers = new Headers();
        headers.append('Content-Type', 'multipart/form-data');
        headers.append('Accept', 'application/json');
        let options = new RequestOptions({ headers: headers });
        this._http.post(`${this.webApiFileUploadURL}`, formData, options)
            .map(res => res.json())
            .catch(error => Observable.throw(error))
            .subscribe(
                data => console.log('success'),
                error => console.log(error)
            )
    }

WebApi 发布请求(失败于 如果 (!Request.Content.IsMimeMultipartContent()) ):

public async Task<HttpResponseMessage> PostFormData()
    {

        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent()) // Fails here 
        {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string root = HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

        try
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the file names.
            foreach (MultipartFileData file in provider.FileData)
            {
                Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                Trace.WriteLine("Server file path: " + file.LocalFileName);
            }
            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (System.Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }

最佳答案

经过深入研究 - 我成功了: 发布时无需设置内容类型标题属性。
我已经从我的 angular2 http.post 请求和 web-api post 方法中的 Request.Content.IsMimeMultipartContent() 已通过(与 postman 中相同)

关于c# - Request.Content.IsMimeMultipartContent() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48749008/

相关文章:

C# 为结构错误的属性赋值

c# - 在实现 IEnumerable 的类上序列化自定义属性

c# - 为什么 DllImport for C bool as UnmanagedType.I1 throws but as byte it works

c# - 使用 iTextSharp 将 PDF 文件中使用的字体保存到文件

c# - 如何使用 webapi 2 将数据从 AuthorizeAttribute 传递到 Controller ?

c# - 无法加载文件或程序集 'System.Web.Http.Owin'

javascript - 如何将 json POST 数据作为对象传递给 Web API 方法?

java - 如何使用java通过HttpPost发送空的二进制数据

使用名称值对的 Android Volley 发布请求

http-post - 什么时候用POST,什么时候用GET?