Avatar billede henrikgn Nybegynder
04. april 2005 - 13:51 Der er 22 kommentarer og
1 løsning

Download i C#

Hej eksperter

Jeg er ved at lave en ASP.NET-side, der kan downloade forskellige filer (mest .pdf) fra min server. Filerne skal downloades (dvs. jeg vil have vinduet med "Gem som..."-muligheden frem uanset dokumenttype) og pdf-dokumentet skal IKKE bare åbnes via browseren.

Jeg kan ikke rigtigt finde ud af om jeg skal bruge System.Net.WebClient eller måske System.IO.Stream? Jeg håber der er en der kan komme med et eksempel, hvor dette virker?

//HenrikGN
Avatar billede burningice Nybegynder
04. april 2005 - 14:02 #1
Det er hverken eller...

Du skal loade din fil op i et en strem og derefter gemme det til Response.OutputStream.

Dernæst skal du også sikre dig at sidens contenttype er sat rigtigt. I de fleste tilfælde vil application/octet-stream tvinge browseren til at gemme filen, lige meget hvad.
Avatar billede henrikgn Nybegynder
04. april 2005 - 14:08 #2
Jeg har følgende:

string sti = "http://www.minserver.dk/filer/file.pdf";
string filnavn = "nyfil.pdf";

FileStream objFileStream = new FileStream(sti,FileMode.Open);

int filstr = (int)objFileStream.Length;
byte[] Buffer = new byte[filstr];
objFileStream.Read(Buffer, 0, filstr);
objFileStream.Close();

Response.ContentType = "application/octet-stream";

Hvad gør jeg så herfra? Har desuden et problem med fejlen "URI-formater understøttes ikke"...
Avatar billede emberwild Nybegynder
04. april 2005 - 15:24 #3
hvis du ikke har fysisk adgang til filen skal du rigtig nok bruge WebRequest-klassen for at loade den ind først. Men så bliver det hurtigt noget ping-ping hvor at der hentes fra det ene sted der henter fra et andet det henter fra et tredie som igen henter fra det første sted.
Avatar billede henrikgn Nybegynder
04. april 2005 - 15:44 #4
Jeg er ikke blevet så meget klogere endnu... Nogen der kan hjælpe?
Avatar billede burningice Nybegynder
04. april 2005 - 15:54 #5
har du fysisk adgang til filen, eller ikke?
Avatar billede henrikgn Nybegynder
04. april 2005 - 16:03 #6
joda, det har jeg.
Avatar billede burningice Nybegynder
04. april 2005 - 16:26 #7
så skal din sti heller ikke være af formatet http:// men c:\

Response.Clear();
Response.ContentType = "application/octet-stream";

string sti = @"c:\filer\file.pdf";
string filnavn = "nyfil.pdf";

FileStream objFileStream = new FileStream(sti,FileMode.Open);

objFileStream.Save(Response.OutputStream);
Avatar billede henrikgn Nybegynder
04. april 2005 - 16:37 #8
Okay, men hvad nu når filen ligger på en server - hvordan gør jeg det så?
Avatar billede burningice Nybegynder
04. april 2005 - 16:41 #9
på en server? du mener altså ikke på den computer som selve koden køres fra?
Avatar billede henrikgn Nybegynder
04. april 2005 - 16:47 #10
hehe på en server ja. Som der også står i første linje af mit spørgsmål:

"Jeg er ved at lave en ASP.NET-side, der kan downloade forskellige filer (mest .pdf) fra min server."

Jeg eftersøger stadig et kode-eksempel på dette :)
Avatar billede burningice Nybegynder
04. april 2005 - 16:52 #11
der kan du bruge webrequest. prøv at kig på denne artikkel

http://www.developer.com/net/net/article.php/3340151
Avatar billede henrikgn Nybegynder
06. april 2005 - 17:08 #12
Hej igen, så har jeg kigget på WebRequest og har følgende side:

public void Download(object sender, EventArgs e)
{
  Stream remoteStream  = null;
  Stream localStream  = null;
  WebResponse response = null;

  try
  {
    WebRequest request = WebRequest.Create("http://www.minserver.dk/filer/file.pdf");
    if (request != null)
    {
      response = request.GetResponse();
      if (response != null)
      {
        remoteStream = response.GetResponseStream();
        localStream = File.Create(@"c:\lokalfil.pdf");
        byte[] buffer = new byte[1024];
    int bytesRead;

        do
        {
          bytesRead = remoteStream.Read (buffer, 0, buffer.Length);
          localStream.Write (buffer, 0, bytesRead);
        } while (bytesRead > 0);
      }
    }
  }
  catch(Exception ex)
  {
    Console.WriteLine(ex.Message);
  }
  finally
  {
  if (response != null) response.Close();
  if (remoteStream != null) remoteStream.Close();
  if (localStream != null) localStream.Close();
  }
}

Dette virker fortrinligt - den henter filen ned i den lokale mappe helt automatisk. Men det var jo ikke dette der var hensigten... Jeg vil jo stadig gerne have vinduet op, hvor man kan vælge "Åben", "Gem" eller "Fortryd" - så kan man jo også selv vælge, hvor der skal gemmes på den lokale computer...

Kan man ikke lave det sådan dette vindue kommer frem?
Avatar billede burningice Nybegynder
06. april 2005 - 17:36 #13
istedet for at gemme på en localstream skal du jo bare sørge for at gemme i OutputStream

    WebRequest request = WebRequest.Create("http://www.minserver.dk/filer/file.pdf");
    if (request != null)
    {
      response = request.GetResponse();
      if (response != null)
      {
        remoteStream = response.GetResponseStream();
        byte[] buffer = new byte[1024];
        int bytesRead;

        do
        {
          bytesRead = remoteStream.Read (buffer, 0, buffer.Length);
          Response.OutputStream.Write (buffer, 0, bytesRead);
        } while (bytesRead > 0);
      }
    }
Avatar billede henrikgn Nybegynder
06. april 2005 - 17:48 #14
Tror jeg nærmer mig.... men der kommer stadig intet vindue frem - pdf-filen hentes (uden nogen menu - browseren arbejder blot) og åbnes herefter automatisk.
Avatar billede burningice Nybegynder
06. april 2005 - 17:57 #15
og du har husket at sætte contenttype til det rigtige?
Avatar billede henrikgn Nybegynder
06. april 2005 - 18:02 #16
Hele min side:

<%@ Page Language="CS" debug="true" %>
<%@ Import NameSpace="System.Net" %>
<%@ Import NameSpace="System.IO" %>

<script runat="server">

public void Download(object sender, EventArgs e)
{
Stream remoteStream  = null;
WebResponse response = null;
try
{
WebRequest request = WebRequest.Create("http://www.minserver.dk/filer/file.pdf");
if (request != null)
{
response = request.GetResponse();
if (response != null)
{
remoteStream = response.GetResponseStream();
byte[] buffer = new byte[1024];
int bytesRead;

do
{
bytesRead = remoteStream.Read (buffer, 0, buffer.Length);
Response.ContentType = "application/octet-stream";
Response.OutputStream.Write (buffer, 0, bytesRead);
} while (bytesRead > 0);
}
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (response    != null) response.Close();
if (remoteStream != null) remoteStream.Close();
}
}

</script>

<html>
<head>
<title>Hent PDF-fil</title>
</head>
<body>
<h2 align="center">Hent PDF-fil her:</h2>
<form runat="server">
<hr>
<asp:Button Runat="server" ID="btnDagens" OnClick="Download" Text="Hent PDF-fil"/>
</form>
</body>
</html>

Mangler jeg noget?
Avatar billede burningice Nybegynder
06. april 2005 - 18:19 #17
har du glemt hvad jeg skrev i 04/04-2005 16:26:56

Response.Clear();
Response.ContentType = "application/octet-stream";
Avatar billede henrikgn Nybegynder
07. april 2005 - 16:32 #18
Nej, har skam ikke glemt det, har ContentType med - se ovenfor. Det giver ingen ændring at indsætte Response.Clear() inden.
Avatar billede burningice Nybegynder
07. april 2005 - 17:10 #19
som sagt i starten, så er det kun i de fleste tilfælde application/octet-stream vil tvinge browseren til at gemme filen. Prøv dig frem med forskellige ContentTypes, og hvis det slet ikke vil virke, så bliver du nødt til at zippe dine filer.
Avatar billede henrikgn Nybegynder
07. april 2005 - 17:23 #20
Hmmm, tanken er hermed opgivet. Troede absolut at man kunne bestemme, at browseren altid skal give brugeren muligheden for at åbne eller gemme filen - uanset filtype.

Men så blev jeg da så meget klogere...

cyberfessor: Du har fortjent points, smid venligst et svar.
Avatar billede henrikgn Nybegynder
07. april 2005 - 17:31 #21
PS. Kan du give mig et hint til hvilke andre ContentType muligheder jeg kan forsøge?
Avatar billede burningice Nybegynder
07. april 2005 - 23:30 #22
en søgning på google (http://www.google.dk/search?q=contenttype+force+download&sourceid=mozilla-search&start=0&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:en-US:official)

en forslag er at bruge en header
Response.AddHeader("content-disposition", "attachment;filename=dinfil.pdf");
Avatar billede henrikgn Nybegynder
11. april 2005 - 12:16 #23
Tak for svarerne, har forsøgt det meste nu, uden held. PDF-dokumentet vil altså åbnes automatisk uanset hvad.
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