Vă mulțumim pentru susținere

Calea absolută înapoi spre calea web-relativă

Dacă am reușit să localizez și să verific existența unui fișier folosind Server.MapPath și acum vreau să trimit utilizatorul direct la acel fișier, care este calea cea mai rapidă pentru a converti acea cale absolută într-o cale web relativă?

0
adăugat editat

5 răspunsuri

Dacă ați folosit Server.MapPath, ar trebui să aveți deja calea web relativă. În conformitate cu documentația MSDN , această metodă ia o variabilă, calea , care este calea virtuală a serverului Web. Deci, dacă ați reușit să apelați această metodă, trebuie să aveți deja accesibil calea web relativă.

0
adăugat
Acest lucru nu este neapărat adevărat - apelul MapPath ar fi putut fi efectuat printr-o altă metodă și ar fi fost transferat în / apelat din metoda mea de verificare a fișierelor sau (în cazul meu) construit dintr-un număr de elemente diferite, dintre care unul este directorul meu de resurse ca "~ / __ Resurse"). Evident, direcționarea utilizatorului către această cale va duce la rezultate neașteptate. Acest lucru ar fi de asemenea util să știm pentru că uneori calea fișierului absolut ar fi putut fi scoasă din baza de date fără alte informații contextuale.
adăugat autor tags2k
@tagsk - Nu știu despre asta. Prin modul în care metoda este definită, dacă șirul pe care îl introduceți în Server.MapPath este valabil și returnează o cale de server fizic, atunci aceasta trebuia să fi fost și o cale virtuală valabilă, indiferent de modul în care ați generat-o. În ceea ce privește utilizarea tildei (~) la începutul unei adrese virtuale, consultați acest articol MSDN pe Cale ale site-ului ASP.NET :> ASP.NET include apl
adăugat autor Yaakov Ellis
Yaakov - Nu așa. De exemplu, o funcție pe care o folosesc are o cale rădăcină și returnează recursiv o colecție IEnumerable . În aplicația mea web pot oferi această cale rezolvând calea mea relativă la una fizică, dar când primesc din nou această listă recursivă și vreau să le dau înapoi în căile relative în aplicația mea nu am acea informație.
adăugat autor one.beat.consumer

Poate că acest lucru ar putea funcționa:

String RelativePath = AbsolutePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty);

Eu folosesc c #, dar ar putea fi adaptat la vb.

0
adăugat
@ GateKiller : Rețineți că dacă utilizați directoarele IIS în site-ul dvs. web, soluția dvs. poate eșua deoarece aplicația calea fizică poate fi diferită de calea fizică a fișierului.
adăugat autor Costo
Acest lucru funcționează numai în contextul unei solicitări.
adăugat autor bzlm

Știu că acest lucru este vechi, dar trebuia să contabilizez directoarele virtuale (după comentariul lui @ Costo). Acest lucru pare să ajute:

static string RelativeFromAbsolutePath(string path)
{
    if(HttpContext.Current != null)
    {
        var request = HttpContext.Current.Request;
        var applicationPath = request.PhysicalApplicationPath;
        var virtualDir = request.ApplicationPath;
        virtualDir = virtualDir == "/" ? virtualDir : (virtualDir + "/");
        return path.Replace(applicationPath, virtualDir).Replace(@"\", "/");
    }

    throw new InvalidOperationException("We can only map an absolute back to a relative path if an HttpContext is available.");
}
0
adăugat

Nu ar fi frumos să ai Server.RelativePath (calea) ?

bine, trebuie doar să-l extindeți ;-)

public static class ExtensionMethods
{
    public static string RelativePath(this HttpServerUtility srv, string path, HttpRequest context)
    {
        return path.Replace(context.ServerVariables["APPL_PHYSICAL_PATH"], "~/").Replace(@"\", "/");
    }
}

Cu asta puteți să sunați pur și simplu

Server.RelativePath(path, Request);
0
adăugat
o înlocuire mai bună a căii fizice ar fi ~ /. cale.Replace (context.ServerVariables ("APPL_PHYSICAL_PATH"), "~ /")
adăugat autor Josh Russo

Îmi place ideea de la Canoas. Din păcate, nu am avut "HttpContext.Current.Request" disponibil (BundleConfig.cs).

Am schimbat metoda ca aceasta:

public static string RelativePath(this HttpServerUtility srv, string path)
{
     return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
}
0
adăugat