使用 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 不支持的媒体类型