Avatar billede cogitans Nybegynder
20. juli 2004 - 20:37 Der er 59 kommentarer og
1 løsning

Link til fil, så clienten kan hente filen

Hvordan laver man et link (hvilken benyttes på en aspx-side), som yder den funktionaltet, at filen downloades til klienten?
Avatar billede arne_v Ekspert
20. juli 2004 - 20:41 #1
Hvad er der galt med gode gamle:

<a href="link">tekst</a>

?

Vil browseren vise filen i.s.f. at downloade den ?
Avatar billede cogitans Nybegynder
20. juli 2004 - 20:44 #2
Næh, den kan slet ikke finde den. Linket (den lokale sti til filen) bliver opbygget inde i koden, og skal så serveres for klienten...
Avatar billede arne_v Ekspert
20. juli 2004 - 20:47 #3
Den skal jo bare være relativ i forhold til nuværende side.

/dir/side.aspx

noget.zip => /dir/noget.zip

subdir/noget.zip => /dir/subdir/noget.zip

/dir2/noget.zip => /dir2/noget.zip

../noget.zip => /noget.zip

../dir2/noget.zip => /dir2/noget.zip
Avatar billede cogitans Nybegynder
20. juli 2004 - 20:55 #4
ja ja, her snakker du jo HTML. Jeg skal bruge C#.
Avatar billede arne_v Ekspert
20. juli 2004 - 21:07 #5
Din C# kode bliver til HTML i sidste ende.

Old style er det vel:

<%
string link = "../" + "dir/" + "side.aspx";
%>

<a href="<%=link%>">overskrift</a>

New style se f.eks. her:

http://www.west-wind.com/presentations/wwMessageDisplay/wwMessageDisplay.asp

og  RedirectHyperLink.

Men i sidste instans er det stadig et spørgsmål om at generere den rigtige HTML.
Avatar billede cogitans Nybegynder
20. juli 2004 - 21:16 #6
Ja, det er rigtigt. Jeg har netop prøvet med dit forslag. I koden ser det således ud:
"
    string filNavn=(string)((LinkButton)sender).CommandArgument;
    string filNavn2="<a href=\"" + filNavn + "></a>";
    System.Diagnostics.Debug.Write("filnavnet et: "+ filNavn2);
"
og debugeren skriver:
"filnavnet et: <a href="G:\Temp\abc.mp3></a>"
hvor stien er rigtig nok...men det fungerer stadig ikke. Aspx'en skriver stadig "siden kan ikke vises" i hele frame'et. Mon jeg skal prøve med syntax for en fil i stedet for <a href>?
Avatar billede snepnet Nybegynder
20. juli 2004 - 21:18 #7
Cogitans... du skriver om den samme i to forskellige spørgsmål, og svaret er det samme begge steder.
Hvis du ikke sørger for at folk kan nå dine filer med en url gennem IIS'en bliver det noget kludder.
Du kan sagtens streame indholdet ud i browseren (sansynligvis uanvendeligt), eller kopiere den til et web-dir inden du generer linket (og slette den bagefter selvfølgelig), men det er unødigt besværligt hvis du laver en sådan løsning.
Avatar billede arne_v Ekspert
20. juli 2004 - 21:18 #8
G:\Temp\abc.mp3 er da også rivende galt !

Det skal jo være en URL til IIS ikke en sti på harddisken.
Avatar billede cogitans Nybegynder
20. juli 2004 - 21:20 #9
snepnet:
Grunen til jeg spørger om det her er, at det netop er et spørgsmål for sig selv = point for sig selv.
Avatar billede arne_v Ekspert
20. juli 2004 - 21:20 #10
Hvis siden hedder http://server/app/side1.aspx, så skal du generere en
URL ligesom abc.mp3 som får browseren til at requeste http://server/app/abc.mp3
som serveren så kan dind ehvis den ligger i samme dir som side1.aspx
Avatar billede arne_v Ekspert
20. juli 2004 - 21:21 #11
så kan dind ehvis = så kan finde hvis
Avatar billede cogitans Nybegynder
20. juli 2004 - 21:21 #12
Vil det så sige, at man ikke kan lave direkte links til filer på harddisken, men at man SKAL lave en virtuelt mappe i IIS, hvori der så er en genvej til filen?
Avatar billede cogitans Nybegynder
20. juli 2004 - 21:23 #13
Den ligger lige netop alle andre steder, en det bibliotek, som aplikationen er i.
Avatar billede arne_v Ekspert
20. juli 2004 - 21:24 #14
Den kan godt ligge i et andet dir.

Hvis du laver link /mp3s/abc.mp3 så requester browseren http://server/mp3s/abc.mp3
men serveren skal stadig have den URL mappet til der hvor filen er.
Avatar billede arne_v Ekspert
20. juli 2004 - 21:24 #15
Af indlysende sikkerheds hensyn kan IIS ikke bare "udlevere" alle mulige filer.
Avatar billede snepnet Nybegynder
20. juli 2004 - 21:25 #16
Du kan lave virtual directories under dit root-web, og få dem til at pege på de 5-6 forskellige steder du snakker om.
Så kan du lave url-er til dem.
Avatar billede cogitans Nybegynder
20. juli 2004 - 21:27 #17
Nej, det ville da være trælst.

Men du var altså enig i, at jeg kan lave virtuelle mapper (som peger på det aktuelle bibliotek), og så lave et link i c#, som peger på det aktuelle bibliotek? Og så skulle det virke?
Avatar billede snepnet Nybegynder
20. juli 2004 - 21:27 #18
Ok... nu tror jeg at vi holder os til at skrive om det i det ene spørgsmål.
Jeg svarer nu herinde på :
http://www.eksperten.dk/spm/517125#rid4785748
Og svaret er :
Nej du skal lave virtuelle biblioteker som peger hen på dine fysiske biblioteker, og du skal så lave dit link så det går gennem dit virtuelle.
Avatar billede arne_v Ekspert
20. juli 2004 - 21:29 #19
Du skal generere et link som får browseren til atrequeste en URL som får
serveren til at kunen finde filen.
Avatar billede cogitans Nybegynder
20. juli 2004 - 21:30 #20
et link på formen: <a href.....></a> ?
Avatar billede snepnet Nybegynder
20. juli 2004 - 21:30 #21
Hvis du har et web der hedder cogitans (virtuelt), kan du under det lavet et subweb der heder files.
files (virtuelt) peger så på f.eks. G:\Storage\Music\
Og du kan så lave et link der hedder :
http://localhost/files/somefile.fil
Avatar billede snepnet Nybegynder
20. juli 2004 - 21:32 #22
Avatar billede snepnet Nybegynder
20. juli 2004 - 21:33 #23
Og det vil så også du hvis folk rammer dig via ip - altså http://<din ip>/cogitans/files/somefile.fil
Avatar billede snepnet Nybegynder
20. juli 2004 - 21:34 #24
Dohhhh... hold da... en mærkelig sætning :o)
Avatar billede cogitans Nybegynder
20. juli 2004 - 21:34 #25
Det er forvirrende lige nu.

Jeg har lige lavet et virtuelt bib. (er navnet egentlig ligemeget?), som peger på g:\musik\abc.mp3. Og i koden laver jeg: <a href=\"" + filNavn + "></a>"; hvor filnavn=g:\musik\abc.mp3.Men dette vrker ikke?
Avatar billede arne_v Ekspert
20. juli 2004 - 21:36 #26
variabeln filnavn skal indehodle det virtuelle directory *ikke* det fysiske directory !
Avatar billede cogitans Nybegynder
20. juli 2004 - 21:39 #27
Okay - men Response.Redirect("Musik\\abc.mp3"); virker heller ikke. (mt virtuelle bib hedder 'Musik')
Avatar billede arne_v Ekspert
20. juli 2004 - 21:42 #28
Prøv:

Response.Redirect("/Musik/abc.mp3");
Avatar billede arne_v Ekspert
20. juli 2004 - 21:42 #29
URL'er bruger / ikke \ og jeg formoder at du skal bruge en absolut sti og ikke
en relativ sti.
Avatar billede snepnet Nybegynder
20. juli 2004 - 21:43 #30
Hvis du ikke ved hvor du er i forhold til diret kan du muligvis skrive Response.Redirect("~/Musik/abc.mp3");
(jeg er ikke sikker)
Avatar billede cogitans Nybegynder
20. juli 2004 - 21:47 #31
Tja, nu ser det da ud som om, et fungerer. Jeg må lige teste det i morgen over netværket også. tak indtil vdere :-)
Avatar billede cogitans Nybegynder
21. juli 2004 - 20:43 #32
Nu har jeg oprettet virtuelle bibliotekker i IIS, og sat link ind. Men de andre brugere på netværket (klienterne), kan stadig ikke få en forbindelse til filerne. Er der nogle, som har et forslag til et nyt løsningsforslag, som jeg kan prøve?
Avatar billede snepnet Nybegynder
21. juli 2004 - 20:47 #33
kan du vise et konkret eksempel på en url der bliver genereret i koden, og som du laver en response.redirect til ?
Avatar billede arne_v Ekspert
21. juli 2004 - 21:02 #34
Det skal virke.

Check de genererede links og mapningen.
Avatar billede cogitans Nybegynder
21. juli 2004 - 22:48 #35
Jeg havde vist ikke lige prøvet alt, i skrev herinde. Jeg mangler lige at bytte \ ud med /. Men nå jeg skriver string a="\"; og string b="/"; i koden (hvilket jeg benytter i Replace-metoden i string-klassen), så siger den, at den forventer en ny linie i udtrykket string a="\"; . Jeg prøvede så at skrive string a="\\"; i stedet, men så bliver der overhovedet ikke nyttet om på de 2 chars inde i strengen. Hvad gør jeg forkert her?
Avatar billede cogitans Nybegynder
21. juli 2004 - 22:53 #36
nyttet=byttet :-)
Avatar billede snepnet Nybegynder
21. juli 2004 - 22:54 #37
Kan du ikke lige vise koden ?
Husk at
string s = "tta";
s.Replace("a","c");
Ikke giver noget... Replace returnerer en ny streng, så det er nødvendigt at skrive
s = s.Replace(...);
Avatar billede cogitans Nybegynder
21. juli 2004 - 23:20 #38
Jo, nu fungerer det...i hvert fald på min computer. Jeg må lige teste det i morgen.
Men jeg synes, at det tager utrolig lang tid med store filer. Der bliver vel ikke taget en midlertidig kopi af filen på klientens computer, før man får mulighed for at gemme/ekserkvere den?
Avatar billede snepnet Nybegynder
27. juli 2004 - 00:08 #39
IE plejer at smide filer ned i et tempdir, inden de bliver kopieret til den endelig destination.
Avatar billede cogitans Nybegynder
27. juli 2004 - 10:00 #40
Det virker stadig kun på mn computer. Over netværket giver det fejl. Koden ser sålees ud:

aspx:
<%@ Page language="c#" Codebehind="XPOpdateringerE.aspx.cs" AutoEventWireup="false" Inherits="New.XPOpdateringerE" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <title>DrectoryBrowser</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body bgcolor="#e7e7ef">
        <form id="Form1" method="post" runat="server">
            <asp:table id="tblFileView" runat="server" Font-Names="Verdana" CellSpacing="0" CellPadding="1"
                BorderColor="Gray" BorderWidth="1px" BorderStyle="Solid" GridLines="Both" Font-Size="XX-Small">
                <asp:TableRow ForeColor="#000040" BackColor="#FFFFC0" Font-Bold="True">
                    <asp:TableCell Text="ItemName"></asp:TableCell>
                    <asp:TableCell Text="Creation DataTime"></asp:TableCell>
                </asp:TableRow>
            </asp:table>
        </form>
    </body>
</HTML>

cs:
using System;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using New;

namespace New
{
    /// <summary>
    /// Summary description for WebForm1.
    /// </summary>
    public class XPOpdateringerE : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Table tblFileView;

        private void Page_Load(object sender, System.EventArgs e)
        {           
            //AddDirectoryView(Request.PhysicalApplicationPath);
            if(CurrentPath == null)
                CurrentPath = Request.PhysicalApplicationPath;
            AddDirectoryView(CurrentPath);
        }

        // metode til at smide rækkerne ind i tabellen
        //(sørger for at du bliver stående samme sted i filstrukturen, hvis du prøver at stikke næsen i et dir du ikke må kigge i - istedet for at fejle)
        public void AddDirectoryView(string path)
        {
            try
            {
                // parent path
                DirectoryInfo parent = Directory.GetParent(path);
                if(parent != null)
                    AddItem(parent);
                // først indsættes rækker for alle direktories i path
                string[] items = Directory.GetDirectories(path);
   
                foreach (string s in items)
                {
                    AddItem(new DirectoryInfo(s));
                }           

                // derefter rækker for alle filer
                items = Directory.GetFiles(path);           
                foreach (string s in items)
                {
                    AddItem(new FileInfo(s));
                }
            }
            catch
            {
                string lp = LastPath;
                CurrentPath = LastPath;
                LastPath = lp;
                Response.Redirect(Request.RawUrl);
            }
        }


        // metode til at smide en enkelt række ind i tabellen
        private void AddItem(FileSystemInfo itemInfo)
        {
            tblFileView.Rows.Add(CreateItemRow(itemInfo));           
        }

        // metode til at danne en række
        private TableRow CreateItemRow(FileSystemInfo itemInfo)
        {
            TableRow tr = new TableRow();           

            // lidt farveværk
            if(itemInfo is DirectoryInfo)
                tr.BackColor = Color.LightBlue;
               
            // en linkbutton så man kan klikke på fil/dir navnet
            LinkButton lbtn = new LinkButton();
            lbtn.Click += new EventHandler(lbtn_Click);
            lbtn.Text = itemInfo.Name;
            lbtn.CommandName = itemInfo.GetType().Name;
            lbtn.CommandArgument = itemInfo.FullName;
            lbtn.Style.Add("text-decoration","none");

            // ind med knappen
            tr.Cells.Add(CreateItemCell(lbtn));

            // ind med en ekstra oplysning
            tr.Cells.Add(CreateItemCell(new LiteralControl(itemInfo.CreationTime.ToString())));           

            return tr;
        }

        // metode til at danne en enkelt celle
        private TableCell CreateItemCell(Control content)
        {
            TableCell tc = new TableCell();
            tc.Controls.Add(content);
            return tc;
        }

        // håndtering af click-event fra knappen - CommandArgument skulle så gerne indeholde den fulde sti
        private void lbtn_Click(object sender, EventArgs e)
        {
            if(((LinkButton)sender).CommandName == "DirectoryInfo")
            {
                LastPath = CurrentPath;
                CurrentPath = ((LinkButton)sender).CommandArgument;                           

                Response.Redirect(Request.RawUrl);   
            }           
            else if(((LinkButton)sender).CommandName == "FileInfo")
            {
                DatabaseFtpManagement instans=new DatabaseFtpManagement();
                string filNavn=(string)((LinkButton)sender).CommandArgument;//=@"G:\Movies..."
                instans.run(this, filNavn);
                string newFile=filNavn.Remove(0, 3);//=Movies\...
                string a="\\";
                string b="/";
                string endeligFil=newFile.Replace(a, b); //=/Movies../...
                string endeligFil2="/"+endeligFil;
                //System.Diagnostics.Debug.Write("efter erstatning: "+ endeligFil2);
                //string endeligFil3="<a href=\"http:="+endeligFil2+"></a>";
                //System.Diagnostics.Debug.Write("efter erstatning: "+ endeligFil3);
                //Response.Redirect(filNavn);
                Response.Redirect(endeligFil2);
            }
        }

        // her returneres så startdiret fra før, hvis variablen ikke tidligere er sat
        //=her gåes et skridt tilbage 
        //protected string CurrentStartPath
        //{
        //    get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : Request.PhysicalApplicationPath;}
        //    set{Session["CurrentPath"] = value;}
        //}

        protected string CurrentPath
        {
            get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : @"E:XP-Opdateringer";}
            set
            {
                if (value == @"E:\")
                    Session["CurrentPath"] = @"E:XP-Opdateringer";
                else
                    Session["CurrentPath"] = value;
            }
        }

        protected string LastPath
        {
            get{return (string)Session["LastPath"];}
            set{Session["LastPath"] = value;}
        }




        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
        }
       
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        private void Repeater1_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e)
        {
        }
    }
}
Avatar billede snepnet Nybegynder
27. juli 2004 - 10:37 #41
hvad står der i endeligFil2 når du kører koden ?
Avatar billede cogitans Nybegynder
27. juli 2004 - 11:00 #42
Der står f.eks. : /MoviesNotBurned5/WMR80.zip
Avatar billede cogitans Nybegynder
27. juli 2004 - 11:03 #43
Hvor "MoviesNotBurned5" er det mappede bibliotek i IIS.
Avatar billede snepnet Nybegynder
27. juli 2004 - 11:04 #44
Er det mappet under det web du er i, eller er det et andet web... Hvis det er det sidste der er tilfældet skal du have host ind foran.
Avatar billede cogitans Nybegynder
27. juli 2004 - 11:41 #45
"det web jeg er i"????
Det er mapped under mit netværksnavn, hvis det er det, du mener...?
Avatar billede snepnet Nybegynder
27. juli 2004 - 13:17 #46
Jeg mener om det er et subweb til et web under default web, eller om det er et web der ligger direkte under dit default web.
Avatar billede cogitans Nybegynder
27. juli 2004 - 16:55 #47
Altså namespacet 'New' ligger i bibliotekket 'New', som ligger i 'wwwroot'. Men jeg har lavet det til mit default web, da jeg har lavet en reference til filen i 'New' inde i 'default.aspx' i wwwroot.
Avatar billede snepnet Nybegynder
27. juli 2004 - 16:56 #48
Nu var det mere MoviesNotBurned5 jeg tænkte på... det er jo det du skal linke til.
Avatar billede cogitans Nybegynder
27. juli 2004 - 17:28 #49
'MoviesNotBurned5' er det interne navn i IIS. 'MoviesNotBurned5' er en reference til 'd:\Share\'.
Avatar billede snepnet Nybegynder
27. juli 2004 - 17:34 #50
Ja - men er det et subweb til new, eller ligger det direkte under default web ?

Hvis det IKKE er et subweb, bliver du nødt til at have noget mere på dit link... Det er jo en relativ url du skriver, så hvis du er på en side i
http://localhost/someforms/
Så vil dit endelige link blive
http://localhost/someforms/moviestoburn5/

Hvis det du i virkeligheden skal have fat i ligger i et helt andet web, skal det jo angives - f.eks :
http://localhost/moviestoburn5/
Avatar billede cogitans Nybegynder
27. juli 2004 - 17:43 #51
Jeg er stadig ikke helt med, når du snakker om subweb osv.
Indholdet af c:\ er:
Inetpub
|-wwwroot
|-default.aspx
|-New
  |-alle filerne

'MoviesNotBurned5' er et navn i IIS.
Det peger som sagt på:
d:\
|-Share

Og hvad er det så, du siger? Someform - hvad mener du med det?
Mener du, at man ikke kan kalde det mappede navn i IIS bare ved at lave et kald til det mappede navn, men at man OGSÅ skal have hostnavnet ind foran det mappede navn? (jeg gik ud fra, at dette kald automatisk blev lavet, når man bare skrev det mappede navn...?)
Avatar billede snepnet Nybegynder
27. juli 2004 - 19:32 #52
Someforms er jo bare et eksempel på et site, som du kunne have oprettet under IIS-en, som jeg brugte for at illustrere hvor du ville havne med det link du sendte.

Hvordan havde du forestillet dig at det navn bare blev lavet ?
Det er jo en relativ sti du angiver - altså relativ i forhold til hvor du er.

Det er derfor jeg bliver ved med at spørge om du har oprettet MoviesNotBurned5 som et subweb under new, eller om det ligger under default website på iisen.

Hvis det er et subweb til New burde du kunne nå det med et link som det her :
"~/MoviesNotBurned5/
Og hvis det ligger som et web under default skal du have fat i
"http://localhost/MoviesNotBurned5/", hvor localhost så bør skiftet ud med det "rigtige" navn.

Det har ikke noget at gøre med hvordan dine filer ligger på c-drevet.... Du skal bruge manageren for IIS-en til at se den slags.
Avatar billede cogitans Nybegynder
27. juli 2004 - 19:38 #53
Jeg har fundet ud af dette delproblem nu. Jeg havde selvfølgelig ikke lavet referencerne til de mappede bibliotekker ordentligt.

Jeg regnede med, at programøren af IIS havde lavet det sådan, at IIS automatisk satte hostnavnet ind foran det mappede bibliotek. Okay - det ville forårsage lidt komplikationer....det ved jeg ;-)

Jeg løste problemet med "http://localhost/MoviesNotBurned5/".
Men jeg er stadig ikke helt med på hvad et "subweb" er...er det, hvis bibliotekket er mappet inde i mapningen af default/aktuelle bibliotek? Hvis det er dér, du mener, så forstår jeg sætningen ;-)
Avatar billede snepnet Nybegynder
27. juli 2004 - 19:43 #54
Ja det er bare om du har mappet det under default web, eller under et allerede eksisterende vitual directory... F.eks. det som du kalder New.
Avatar billede cogitans Nybegynder
27. juli 2004 - 19:46 #55
ahh - okay. Så forstår vi hinanden nu ;-)

Men jeg har mappet dem forsig selv...under default web må det jo så være.
Og så kan jeg så ikke benytte "~/MoviesNotBurned5/", da "~/MoviesNotBurned5/" bare er en relativ sti...har jeg forstået det rigtigt?
Avatar billede snepnet Nybegynder
27. juli 2004 - 19:51 #56
Jeps - helt rigtigt.
Avatar billede cogitans Nybegynder
27. juli 2004 - 19:53 #57
Cowl - det tester jeg lige i morgen så.
Avatar billede snepnet Nybegynder
08. august 2004 - 17:37 #58
hvordan går det med dig cogitans... kan vi få lukket her, eller hvordan ser det ud med det ?
Avatar billede cogitans Nybegynder
08. august 2004 - 18:00 #59
jo, det vil jeg skam også gerne. Jeg har bare ikke fået testet programet helt endnu...
Avatar billede cogitans Nybegynder
11. oktober 2005 - 13:35 #60
lukkes
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester