asp.net webApi并将具有image属性的模型发送到客户端

时间:2014-02-01 15:23:51

标签: json image asp.net-mvc-4 asp.net-web-api

我在一个解决方案中创建了MVC 4 app和web api项目。从mvc 4应用程序我创建产品并上传相关图像,并从web api我将此产品模型发送给客户端。 不知何故喜欢这个课程:

class Product
{
GUID id;
string name;
string details;
string imageUrl;
}

在我的MVC 4应用程序中将图像保存到数据库我这样做:

[HttpPost]
        public ActionResult Edit(Product product, HttpPostedFileBase image)
        {
            if (ModelState.IsValid)
            {
                if (image != null)
                {

                    string imageName = image.FileName;
                    string location = Path.Combine(Server.MapPath("~/Content/Images/") , imageName);
                    image.SaveAs(location);
                    product.Image= location;
                }

                menuItemRepository.SaveOrUpdate(product);
                TempData["message"] = string.Format("{0} has been saved", product.Name);
                return RedirectToAction("Index");
            }
            else
            {
                // there is something wrong with the data values 
                return View(product);
            }
        }

这是获取产品列表的wep api控制器:

public List<MenuComponent> Get()
        {
             return _productRepository.GetAll().ToList();
        }

现在web api将所有产品发送到客户端

但是json中的image属性是绝对路径:

"imageUrl":"C:\\Users\\Hashem\\Documents\\Visual Studio 2012\\Projects\\MyApp\\Content\\Images\\image01.jpg

我希望图片链接类似:http://localhost:22012/Content/images/image01.jpg

我的客户端是iOS应用程序,在将产品保存到数据库后,我将使用其图像属性下载所有图像。

那我怎样才能得到正确的链接?

1 个答案:

答案 0 :(得分:1)

发布图像时,将其保存到物理位置

   string location = Path.Combine(Server.MapPath("~/Content/Images/") , imageName);

并在数据库中存储完全相同的绝对位置。而是将图像保存到物理位置,但将相对位置存储在数据库中。

   string imageName = image.FileName;

   string location = Path.Combine(Server.MapPath("~/Content/Images/") , imageName);
   image.SaveAs(location);

   string rellocation = string.Format( "/Content/Images/{0}", imageName ); 
   product.Image = rellocation;

这样JSON将返回相对路径/Content/Images/image01/jpg

如果您需要使用绝对服务器uris

   string rellocation = Path.Combine( HttpRuntime.AppDomainAppVirtualPath, 
       string.Format( "/Content/Images/{0}", imageName ) );

这应该返回http://localhost:22012/Content/images/image01.jpg

修改:如果出于某些原因这不适合您,请尝试

   Uri uri = this.Request.Url;
   String appDomainPath = uri.Scheme + "://" + uri.Authority;

   string rellocation = Path.Combine ( appDomainPath, ... );

即。尝试从当前请求路径获取路径。这应该在mvc控制器中工作。