Is there any easy (built in) way in an asp.net mvc view to get the absolute path of a file in the content folder?
At the moment I'm using
@Url.Content("~/Content/images/logo.png")
But the path returned isn't absolute.
I know it is possible to build its own helper for such cases but I'd like to know if there's any easier way...
The getAbsolutePath() method is a part of File class. This function returns the absolute pathname of the given file object. If the pathname of the file object is absolute then it simply returns the path of the current file object.
To obtain the full path of a file, we use the readlink command. readlink prints the absolute path of a symbolic link, but as a side-effect, it also prints the absolute path for a relative path. In the case of the first command, readlink resolves the relative path of foo/ to the absolute path of /home/example/foo/.
The pwd command displays the full, absolute path of the current, or working, directory.
In this case, first, we need the current script's path, and from it, we use dirname to get the directory path of the script file. Once we have that, we cd into the folder and print the working directory. To get the full or absolute path, we attach the basename of the script file to the directory path or $DIR_PATH.
This works for me:
A helper:
using System;
using System.Web;
using System.Web.Mvc;
public static class UrlExtensions
{
public static string Content(this UrlHelper urlHelper, string contentPath, bool toAbsolute = false)
{
var path = urlHelper.Content(contentPath);
var url = new Uri(HttpContext.Current.Request.Url, path);
return toAbsolute ? url.AbsoluteUri : path;
}
}
Usage in cshtml:
@Url.Content("~/Scripts/flot/jquery.flot.menuBar.js", true)
// example output:
// http://example.com/directory/Scripts/flot/jquery.flot.menuBar.js
This will generate an absolute url to an image (or file)
Request.Url.Scheme + "://" + Request.Url.Authority + Url.Content("~/Content/images/logo.png")
This works in Asp.net Core
Context.Request.Scheme + "://" + Context.Request.Host + Url.Content("~/images/logo.png")
Url.Content does return the absolute path. What you want is the domain (and port). You can get the current domain by using:
Request.Url.Authority
Then combine this string with the absolute path string of your image. It will return the domain name and if you are on a different port will also include the port number.
new Uri(Request.Url, Url.Content("~/Content/images/logo.png"))
this calls the .ToString() of Uri. You can also put Uri in a variable and call .AbsoluteUri.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With