Toon posts:

[C#] Gegenereerde file downloaden (in nieuw window)

Pagina: 1
Acties:
  • 197 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik zit met een soort van kip/ei-probleem.
1. Ik wil dat de gebruiker een bepaald bestand gaat downloaden en dat dit gebeurt in een nieuw window. Dit kan (bijvoorbeeld) met een window.open in javascript, wat bijvoorbeeld achter het onClick-event van een standaard HTML-button geprogrammeerd kan worden.
2. Het bestand moet echter eerst gegeneerd worden. Dit gebeurt op een bepaalde pagina (pagina X), nadat er op een knop (knop K) gedrukt wordt. Het bestand wordt in C# als volgt gegenereerd:
C#:
1
2
3
4
StreamWriter aFileStream = 
   File.CreateText(@"c:\inetpub\wwwroot\test.txt");
aFileStream.WriteLine("test");
aFileStream.Close();

Deze code zit dus onder het onClick-event van knop K.
Eigenlijk wil ik dus voor probleem 1 een System.Web.UI.HtmlControls.HtmlInputButton gebruiken en voor probleem 2 een System.Web.UI.WebControls.Button :)

Heeft iemand enig idee hoe ik nu de browser weer een schop kan geven om een nieuw venster te openen of om direct het bestand te gaan downloaden, nadat het bestand gegenereerd is?

PS. Response.Write of andere vage oplossingen zijn niet toegestaan!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:57

mulder

ik spuug op het trottoir

Je kunt met c# javascript registreren (RegisterClientScript ofzo iets). Hier mee kun je dus een window openen en de met jou doorgegeven lokatie openen.

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Ja, je kunt idd met Page.RegisterStartupScript of Page.RegisterClientScriptBlock javascript genereren/registreren, maar dat lost 't probleem (volgens mij :?) niet op... Het zorgt eerder voor extra problemen...

Het script kan pas geregistreerd worden als de gebruiker knop K heeft ingedrukt en het bestand is gegenereerd. Maar hoe "force" ik de browser dan dat dat script uitgevoerd wordt?

En als het script 1x is uitgevoerd, wil ik natuurlijk ook niet dat het nogmaals wordt uitgevoerd als de gebruiker bijvoorbeeld de pagina refreshed. :)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:57

mulder

ik spuug op het trottoir

Een C# oplossing ga je dan daar niet voor krijgen. De enigste manier om een new window te openen is clientside.

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
:'( ja, daar was ik al bang voor...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het lijkt me dat als je op die knop druk om het bestand te genereren je ook gewoon Page.RegisterStartupScript( "open new window script" ) toevoegt. En op het moment dat je pagina dan opnieuw geladen word word ook een nieuwe pagina geopent. Dan is het probleem volgens mij gewoon op een nette manier opgelost.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Je hoeft een bestand niet op schijf weg te schrijven voordat deze kan wordt gedownload.
Je schrijf de stream dan direct weg naar de browser.
Dus "druk op knop K" -> redirect naar download.aspx of open een nieuw window dat download.aspx laadt.

Verwijderd

Topicstarter
Sjaaky schreef op 30 oktober 2002 @ 17:03:
Je schrijf de stream dan direct weg naar de browser.
Aan die optie zat ik het laatste half uur idd ook te denken, maar ben nog ff aan het uitproberen of en hoe dat allemaal dan gaat werken... :) Tnx!

Morgen is er weer een dag...

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Er kleven aan het wegschrijven naar schijf, voordat een bestand gedownload kan worden, een aantal nadelen.
Ik neem aan dat de bestanden verschillend moeten zijn voor verschillende gebruikers/ op verschillende tijdstippen. Dus het bestand zal een unieke naam moeten krijgen en het script moet dat ook weten (deze valt wel mee). Daarnaast moeten de bestanden ook weer opgeruimd worden, wie doet dat wanneer?
Bovendien moet je behoorlijk veel moeite gaan doen, wil je voorkomen dat een andere gebruiker een bestand gaat downloaden (door de url te raden) dat eigenlijk niet voor hem bedoeld was.

Verwijderd

Topicstarter
Allemaal helemaal mee eens :)
En ik heb 't nu dus maar zo gemaakt dat ik 't idd direct naar de browser schrijf...
(en dus -helaas- Response.Write moet gebruiken)

Ik begin nu met:
C#:
1
2
3
Response.ContentType = "text/plain"; // if notepad-file
Response.ContentType = "text/x-csv"; // if comma seperated file
Response.ContentType = "application/vnd.ms-excel"; // if excel file

(uiteraard 1 van bovenstaande en niet allemaal tegelijk! :))
Vervolgens spuug ik met Response.Write alle output uit en sluit af met Response.End().

Er is echter nog 1 klein probleempje: Er wordt nu gevraagd of ik download.aspx wil saven... Eigenlijk zou ik nu natuurlijk ofwel "test.txt", "test.csv" of "test.xls" willen wegschrijven. Kan dat ook nog, dan ben ik helemaal content! :)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:57

mulder

ik spuug op het trottoir

ContentHeader, kun je de filename zetten. effe zoeken. Als je het werkend heb moet mij even waarschuwen :D

oogjes open, snaveltjes dicht


  • alley
  • Registratie: Mei 2002
  • Laatst online: 18-08 20:40

alley

ahuh

Volgens mij moest het zetten van de filename als volgt....

code:
1
Response.AppendHeader("Content-Disposition", "attachment; filename=test.xsl");

I am always doing that which I can not do, in order that I may learn how to do it. (Pablo Picasso)


Verwijderd

Topicstarter
Idd :)
Voor de volledigheid hier het stukje code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
switch (aContentType)
{
   case enumContentType.csv: 
      strContentType = "text/x-csv"; 
      strFileName+=".csv"; 
      break;
   case enumContentType.txt: 
      strContentType = "text/plain"; 
      strFileName+=".txt"; 
      break;
   case enumContentType.xls: 
      strContentType = "application/vnd.ms-excel"; 
      strFileName+=".xls"; 
      break;
}

Response.ContentType = strContentType;
Response.AppendHeader("Content-Disposition", "filename="+strFileName);

Response.Write( ... );
[...]

Response.End();

Dit zijn de input-parameters voor bovenstaande method:
- aContentType is een enum met de mogelijke contenttypes (in mijn geval 3)
- strFile is de filename, zonder extensie

Als je die extra "attachment"-parameter gebruikt, kun je de pagina ook openen in de (sommige?) browser(s). Als je 'm weglaat, krijg je alleen een Save-dialog.

Verwijderd

Topicstarter
A bug exists in Microsoft's IE5.5(SP1) web browser where web servers that use a particular HTML command (Content-disposition: attachment) to force the user's browser to download a file will not save the file correctly. Rather than save the file itself (for example an MS Word document) the browser will save the HTML source code of the page instead.
http://www.microsoft.com/...ity/bulletin/MS01-058.asp
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q279667

Related thread: [rml][ php] bestand downen en openen met notepad[/rml]
Pagina: 1