我在一个解决方案中创建了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应用程序,在将产品保存到数据库后,我将使用其图像属性下载所有图像。
那我怎样才能得到正确的链接?
答案 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控制器中工作。