在WebAPI中保存文件后返回文件名

3
我正在使用Web API上传一张图片。
public IHttpActionResult UploadImage()
{
     FileDescription filedescription = null;
    var allowedExt=new string[]{".png",".jpg",".jpeg"};
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    if (Request.Content.IsMimeMultipartContent())
    {
       Request.Content.LoadIntoBufferAsync().Wait();
       var imgTask = Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(new MultipartMemoryStreamProvider()).ContinueWith((task) =>
        {   
                MultipartMemoryStreamProvider provider = task.Result;
                var content = provider.Contents.ElementAt(0);
                Stream stream = content.ReadAsStreamAsync().Result;
                Image image = Image.FromStream(stream);
                var receivedFileName = content.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);
                var getExtension = Path.GetExtension(receivedFileName);                      
                if(allowedExt.Contains(getExtension.ToLower())){
                    string newFileName = "TheButler" + DateTime.Now.Ticks.ToString() + getExtension;
                    var originalPath = Path.Combine("Folder Path Here", newFileName);
                    image.Save(originalPath);
                    var picture = new Images
                    {
                        ImagePath = newFileName
                    };
                    repos.ImagesRepo.Insert(picture);
                    repos.SaveChanges();
                    filedescription = new FileDescription(imagePath + newFileName, picture.Identifier); 
                }
        });

      if (filedescription == null)
       {
           return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, new { message="some error msg."}));
       }
       else
       {
           return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK, filedescription));
       }
    }
    else
    {
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, new { message = "This request is not properly formatted" }));
    }
}

我使用了上述代码来保存图像,但是每次都会返回filedescription即使图像成功保存。请问我做错了什么。

我希望在图像保存后返回filedescription

1个回答

0

你正在错误地使用了很多async方法。你永远不应该以同步的方式调用一个async方法并等待它完成(例如使用Wait()Result)。

如果一个API暴露了一个async方法,那么就要使用await等待它完成,并将调用方法也转换为async方法。

你的filedescription变量总是为空的原因是,你在继续之前检查了它。这真的是一个糟糕的做法:如果你需要一个async操作的结果值,那么你必须等待它完成,但在这种情况下,要使用await关键字。

以下是调用async方法并异步等待它们完成的正确方式:

public async Task<IHttpActionResult> UploadImage()
{
    FileDescription filedescription = null;
    var allowedExt = new string[] { ".png", ".jpg", ".jpeg" };
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    if (Request.Content.IsMimeMultipartContent())
    {
        await Request.Content.LoadIntoBufferAsync();
        var provider = await Request.Content.ReadAsMultipartAsync(new MultipartMemoryStreamProvider());

        var content = provider.Contents.ElementAt(0);
        Stream stream = await content.ReadAsStreamAsync();
        Image image = Image.FromStream(stream);
        var receivedFileName = content.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);
        var getExtension = Path.GetExtension(receivedFileName);
        if (allowedExt.Contains(getExtension.ToLower()))
        {
            string newFileName = "TheButler" + DateTime.Now.Ticks.ToString() + getExtension;
            var originalPath = Path.Combine("Folder Path Here", newFileName);
            image.Save(originalPath);
            var picture = new Images
            {
                ImagePath = newFileName
            };
            repos.ImagesRepo.Insert(picture);
            repos.SaveChanges();
            filedescription = new FileDescription(imagePath + newFileName, picture.Identifier);
        }

        if (filedescription == null)
        {
            return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, new { message = "some error msg." }));
        }
        else
        {
            return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK, filedescription));
        }
    }
    else
    {
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, new { message = "This request is not properly formatted" }));
    }
}

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