使用 web api 上传时不支持的媒体类型

Posted

技术标签:

【中文标题】使用 web api 上传时不支持的媒体类型【英文标题】:Unsupported media type when uploading using web api 【发布时间】:2014-03-25 18:16:59 【问题描述】:

我目前正在迁移一项服务以利用 mvc 中的 asp.net web api。 我有这个 ApiController

[Authorize]
public class UploadController : ApiController

    private readonly ObjectService service;
    private readonly string companyId;

    public UploadController()
    
        this.companyId = "D49AA22B-3476-4FAC-8BEF-38F53F9378F3";
        this.service = new ObjectService(ConfigurationManager.AppSettings["AWSAccessKey"], ConfigurationManager.AppSettings["AWSSecretKey"], this.companyId);
    

    // POST api/upload/5
    [HttpPost]
    [Route("api/upload")]
    public IHttpActionResult StartUpload(UploadModel model)
    
        try
        
            var id = Guid.NewGuid().ToString();

            if (!service.Exists(model.File.FileName))
            
                service.Add(id);

                var stream = new MemoryStream();
                var caller = new AsyncMethodCaller(service.Upload);

                model.File.InputStream.CopyTo(stream);

                var result = caller.BeginInvoke(id, stream, model.File.FileName, new AsyncCallback(CompleteUpload), caller);
            
            else
                throw new Exception("This file already exists. If you wish to replace the asset, please edit it.");

            return Ok(id);
        
        catch (Exception ex)
        
            return InternalServerError(ex);
        
    

    public void CompleteUpload(IAsyncResult result)
    
        var caller = (AsyncMethodCaller)result.AsyncState;
        var id = caller.EndInvoke(result);

        //this.service.Remove(id);
    

    // GET api/upload/progress/5
    [HttpGet]
    [Route("api/upload/progress/id")]
    public IHttpActionResult GetCurrentProgress(string id)
    
        try
        
            var progress = service.GetStatus(id);
            return Ok(progress);
        
        catch (Exception ex)
        
            return InternalServerError(ex);
        
    

    protected override void Dispose(bool disposing)
    
        if (disposing)
            this.service.Dispose();

        base.Dispose(disposing);
    

如您所见,如果我向 api/upload 发帖,它应该会开始上传我的文件。 这些方法是从现有的 mvc 控制器转换而来的(返回 JsonResult 而不是 IHttpActionResult

我的 UploadModel 看起来像这样:

public class UploadModel

    public HttpPostedFileBase File  get; set; 
    public string FileName  get; set; 

我的 jquery 看起来像这样:

function uploadFile() 
    var file = $("#File")[0].files[0];

    if (file) 
        var fileName = "test/" + $('input[type=file]').val().split('\\').pop();
        var data = new FormData();

        data.append("File", file);
        data.append("FileName", fileName);

        $.ajax(
            url: "/Api/Upload",
            type: 'POST',
            data: data,
            contentType: false,
            processData: false,
            success: function (data) 
                console.log("uploading");
                console.log(data);

                createCategory(fileName);
            ,
            error: function () 
                displayAlert(".message", "There was a problem when uploading the file!", "danger");
            
        );
     else 
        createCategory();
    
;

当我运行这段代码时,我得到了错误

POST http://r3plica.localhost:3892/Api/Upload 415(不支持的媒体类型)

但是如果我注释掉 contentType: false, 行并运行我的脚本,我会收到一个错误的请求,虽然我的断点被命中,但 UploadModel 实际上是空的。

谁能提出解决方案?

干杯,

/r3plica

【问题讨论】:

你现在还有这个错误吗?截至 2014 年 8 月... 【参考方案1】:

如果您认为服务返回 JSON,请尝试添加 dataType: 'json', 并在您的 ajax 调用中替换以下错误处理函数,以更好地了解您面临的问题类型

   error: function(xhr, exception) 
       if (xhr.status === 0) 
       alert('Not connected. Verify Login details or Network.');
        else if (xhr.status == 401) 
       alert('Invalid Username or Password');
        else if (xhr.status == 404) 
       alert('Requested page not found. [404]');
        else if (xhr.status == 500) 
       alert('Internal Server Error [500].');
        else if (exception === 'parsererror') 
       alert('Requested JSON parse failed.');
        else if (exception === 'timeout') 
       alert('Time out error.');
        else if (exception === 'abort') 
       alert('Ajax request aborted.');
        else 
       alert('Uncaught Error.\n' + xhr.responseText);
       
       

注释掉内容类型

【讨论】:

【参考方案2】:

我遇到了同样的问题。就我而言,我必须添加写入文件的权限。我遵循了这个建议:https://***.com/a/16948507/2549258,我的 415(不支持的媒体类型)问题消失了。

【讨论】:

以上是关于使用 web api 上传时不支持的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章

.net 核心 Web API - 415 不支持的媒体类型

发布到 Web API 时出现不支持的媒体类型错误

Web API 中 OData POST 的媒体资源支持

不支持的媒体类型 ASP.NET Core Web API

Web API Post 返回 415 - 不支持的媒体类型

尝试使用web api发布txt文件,获得415不支持的媒体类型