[c# / asp.net]Grote bestanden ter download aanbieden

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

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
Voor een project wat ik moet gaan maken is het de bedoeling dat een gebruiker één keer een groot bestand (1,5 / 2 Gb) kan downloaden. De beveiliging hiervan gaat via Forms Authentication.

Nu zou ik ook willen bijhouden of de gebruiker het bestand compleet binnen heeft. Zoniet, dan kan hij nogmaals inloggen en het opnieuw proberen.

Volgens mij kan je dit alleen maar op 2 manieren bewerkstelligen: via Filestream of via WriteFile.

Vraag 1
Is het aan te raden om een bestand op deze manier aan te bieden, en laten we zeggen dat er maximaal 5 gebruikers tegelijkertijd bezig zijn hiermee? Ivm geheugen e.d.

Vraag 2
Is er ook een andere manier om dit rond te breien?

Een FTP download iets is géén optie.

[ Voor 4% gewijzigd door TeeDee op 21-02-2006 15:38 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18:12

mulder

ik spuug op het trottoir

Ik zou gewoon FTP aanbieden, evt een java applet. Bespaart je een hoop ellende lijkt mij, en geeft de gebruiker een FTP client te gebruiken die resume kent.

(volgens mij gaat FileStream -> WriteFile).

[ Voor 40% gewijzigd door mulder op 21-02-2006 15:18 ]

oogjes open, snaveltjes dicht


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
Don Facundo schreef op dinsdag 21 februari 2006 @ 15:18:
Ik zou gewoon FTP aanbieden, evt een java applet. Bespaart je een hoop ellende lijkt mij, en geeft de gebruiker een FTP client te gebruiken die resume kent.

(volgens mij gaat FileStream -> WriteFile).
Dat was in eerste instantie ook mijn voorstel aan de opdrachtgever. Hij wil het alleen idiot proof hebben.

Dus: biedt download link aan, gebruiker download het file en klaar.

Tevens moet er ook enige beveiliging inzitten. D.w.z.: de gebruiker mag het bestand maar 1x downloaden. In totaal zijn er +/- 5000 gebruikers.

[ Voor 8% gewijzigd door TeeDee op 21-02-2006 15:23 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18:12

mulder

ik spuug op het trottoir

Ja, volgens mij dat kan nog steeds met FTP (kan ook een link zijn :) ), zit alleen te denken hoe je zou kunnen bepalen of het bestand volledig gedownload is (FTP server zou dit kunnen loggen?)

oogjes open, snaveltjes dicht


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
Don Facundo schreef op dinsdag 21 februari 2006 @ 15:27:
Ja, volgens mij dat kan nog steeds met FTP (kan ook een link zijn :) ), zit alleen te denken hoe je zou kunnen bepalen of het bestand volledig gedownload is (FTP server zou dit kunnen loggen?)
Okay, maar als de gebruiker deze link naar iemand anders zend, kan deze het bestand ook downloaden. Dat is niet de bedoeling. De gebruiker krijgt ook inlog gegevens welke na verloop van tijd verlopen zijn. Omdat middels FTP te gaan regelen wordt toch erg lastig imho.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Z!oN
  • Registratie: April 2002
  • Laatst online: 03-01-2025

Z!oN

Team Coldfusion

Ik heb er niet zo heel veel verstand van maar, ik zit te denken aan het volgende.

FTP servertje inrichten. Voor elke gebruiker een aparte link aan maken van md5sum(username) evt in combinatie met paswoord. En de logfile van elke beetje fatsoenlijke FTP server is vast wel te vinden welke bestanden (links) er volledig er gedowload zijn en dan weg gooien die links. Wat ook belangerijk is zorgen dat de mappen niet browseable zijn. En dan evt gewoon een heel simpele FTP client schrijven, moet zeggen dat ik geen idee heb hoeveel werk dat is, maar met een SDK kan dat vast niet zo moeilijk zijn, egwoon een 'domme' client waar je verder niets mee kan. Success er nog mee, en laat sowiso even weten wat het geworden is :)

http://www.teamcoldfusion.nl


  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024
Een kopie / symlink van het bestand op de FTP server zetten, en na X tijd weer verwijderen?
En enkel die link aan de gebruiker doorgeven.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18:12

mulder

ik spuug op het trottoir

Okay, maar als de gebruiker deze link naar iemand anders zend, kan deze het bestand ook downloaden.
Je gebruikt toch authentication? Bovendien kan diegene ipv de link ook het bestand doorsturen/branden?
De gebruiker krijgt ook inlog gegevens welke na verloop van tijd verlopen zijn. Omdat middels FTP te gaan regelen wordt toch erg lastig imho.
Dat zal je systeem sowieso zelf moeten regelenen; ook als je wilt gaan streamen, alleen moet je in het geval van streamen nog zelf zorgen dat hij de File goed Transfert ;)

oogjes open, snaveltjes dicht


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
Z!oN / maartenba:
De laatste keer dat ik met FTP op Windows aan de slag ben geweest is vrij lang geleden, maar voor zover ik weet worden symlinks e.d. nog niet goed ondersteund op Windows server software (hetzij serv-u, G6, of IIS FTP e.d.).

maartenba: het file kopiëren is ook geen optie. Dit is namelijk 1,5 / 2 Gb. Ik denk niet dat we hiervoor een dedicated hosting contract af kunnen sluiten.

Maar de hele FTP richting is geen optie.
Don Facundo schreef op dinsdag 21 februari 2006 @ 15:41:
Je gebruikt toch authentication? Bovendien kan diegene ipv de link ook het bestand doorsturen/branden?
Ja, ik gebruik .net formsAuthentication. Of tenminste, dat ben ik van plan.
Wat betreft het bestand doorsturen/branden. Dit heb ik ook aangegeven, en dat vond de opdrachtgever minder erg.
Dat zal je systeem sowieso zelf moeten regelenen; ook als je wilt gaan streamen, alleen moet je in het geval van streamen nog zelf zorgen dat hij de File goed Transfert ;)
Dat goed transferen zal altijd een probleem blijven. Maar die logincredentials, downloadtickets etc. etc. zijn al goed afgebakend. Het gaat erom: is het verstandig om een bestand van 1,5 / 2 Gb via een Stream(WriteFile) aan te bieden en wat voor opties heb ik om te zorgen dat ik kan zien of de download compleet was?

Dit schiet me zo even te binnen...
C#:
1
2
3
4
5
6
7
8
9
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                    //doe hier leuke dingen om aan te geven dat
                    //de download gelukt is. Verwijder user uit DB e.d.
                }
            }

[ Voor 65% gewijzigd door TeeDee op 21-02-2006 15:53 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18:12

mulder

ik spuug op het trottoir

oogjes open, snaveltjes dicht


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
Die kwam ik ook net tegen. Code even gerund, en getest met 8 simultane downloads van 1,5 Gb op mijn testmachine en ik kwam geen gekke dingen tegen. Ziet er goed uit.

Deze code werkt helemaal niet goed. Niet naar de download grootte gekeken. Deze is namelijk 0Kb.

[ Voor 17% gewijzigd door TeeDee op 22-02-2006 15:52 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
Ik bedenk me nu net het volgende:

Als je met deze code aan de slag gaat dan is de download 'stabiel'. Dat heb ik in ieder geval getest. Maar waar het nu uiteindelijk om gaat (en dat is een van de belangrijkste zaken) is het 'tracken' van de download. Is deze compleet binnen etc.

In mijn voorstel 2 posts hierboven
C#:
1
2
3
4
5
6
7
8
9
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                    //doe hier leuke dingen om aan te geven dat
                    //de download gelukt is. Verwijder user uit DB e.d.
                }
            }
is het allemaal wel leuk en aardig, alleen de request, en state zijn afgerond zodra je download begint. Op die manier kan je serverside niets meer uitvoeren.

Het andere artikel heb ik op een aantal manieren geprobeerd werkend te krijgen zonder resultaat.

Ik begin de hoop op te geven dat dit soort zaken niet mogelijk zijn.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Peedy
  • Registratie: Februari 2002
  • Laatst online: 26-01 20:14
Ben ik nu de enige die bedenkt dat je Z!on zijn idee kan pakken, maar geen aparte FTP client maakt, maar de FTP server gewoon via PHP aanstuurt met de standaard ftp functies ?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
pEeDy16 schreef op woensdag 22 februari 2006 @ 17:18:
Ben ik nu de enige die bedenkt dat je Z!on zijn idee kan pakken, maar geen aparte FTP client maakt, maar de FTP server gewoon via PHP aanstuurt met de standaard ftp functies ?
Ten eerste is het C#.
Ten tweede hebben we het hier over files groter > 1.5 Gb en omdat nou in memory te gaan laden lijkt me ook niet echt een strak plan.

De truuk is om met een 'chunked' download dit file zonder veel memory resources bij de client te krijgen. Zodra de gebruiker op een knop geklikt heeft, dan start de download. Op dat moment ben je de state al kwijt. Het enige wat dan nog loopt is de 'chunked' stream naar de client. Je kan dan niet meer de evt. response (mocht dit via een ftp transfer gaan) van een FTP server verwerken.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Is een activex object wat de download afhandelt geen optie? Vergelijk windowsupdate.
Ik neem daarbij maar aan dat het om zo'n specifieke doelgroep gaat dat IE-only niet per se een probleem hoeft te zijn.

Today's subliminal thought is:


  • Z!oN
  • Registratie: April 2002
  • Laatst online: 03-01-2025

Z!oN

Team Coldfusion

Het kan toch niet zo heel moeilijk zijn, zorg dat je een ftp client maakt via een of ander leuk api. Ik kan me niet voor stellen dat dat heel moeilijk is. Maak voor iedere user een account aan met een heel lang wachtwoord en username, wat gebakken zit in je zelf gemaakte programmatje.

Laat het client ding een file uploaden als bv de md5sum overeen komt met het gedownloadde bestand. En een server log die registreerd dat er iets geupload is, weg user.

BFFTPd heeft bijvoorbeeld gewoon statistieken per user in gewone log bestandjes en de users worden beheerd via een ini file, wat wil je nog meer. http is net als e-mail niet bedoeld voor het verplaatsen van grote bestanden. daar is het File Transfer Protocol voor uit gevonden. Je koopt toch ook geen brood bij de slager.

http://www.teamcoldfusion.nl


  • messi
  • Registratie: Oktober 2001
  • Laatst online: 08-04 23:39
ServU kan ook gebruik maken van een sql database, dus je kan gebruikers daarin toevoegen/ verwijderen, werkt prima. Op die manier heb je het hele link doorgeven al bijna opgelost. Verder check je de log of gebruiker x het bestand al volledig heeft gedownload zo ja, dan verwijderen uit de db. of inactive stellen.
ServU is niet de enige ftp server die dit kan, misschien hier eens naar kijken?

Onze excuses voor het ontbreken van de ondertiteling.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
Annie schreef op woensdag 22 februari 2006 @ 23:35:
Is een activex object wat de download afhandelt geen optie? Vergelijk windowsupdate.
Ik neem daarbij maar aan dat het om zo'n specifieke doelgroep gaat dat IE-only niet per se een probleem hoeft te zijn.
Dat zou inderdaad een optie. Ik heb alleen geen flauw idee van wat de doelgroep gebruikt. Ik heb me nog wel even in zitten lezen met MTOM (WSE3) etc. etc.

Punt is dat er inmiddels een vrij klein budget is vrijgeven door de opdrachtgevver, dus voor de FTP-optie kunnen we niet gaan. Als we alleen al dit moeten uit gaan zoeken e.d. schieten we over het budget heen.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Vedett.
  • Registratie: November 2005
  • Laatst online: 12:18
Ik heb zoiets al wel eens gezien, dus weet dat het wel kan.

Vorig jaar op school had ik een abonnement bij MA3D (https://www.ma3d.com/section/14). Daar konden we voor een klein bedrag een 20GB aan software downloaden (ongeveer toch).

Ze konen daar bijhouden welke files ik gedownload had (dat zou gemakkelijk moeten lukken)
Maar ze konden ook kijken of mijn download gelukt was.

Stel ik had 5GB gedownload en probeerde nog een file van 1GB te downloaden. Als die download dus mislukte, stond er nog altijd slechts 5GB op mijn teller. Maw: er werdt gekeken wanneer een file download werd gestopt (geslaagd of niet) en pasten de teller van de gebruiker aan.

Ik zou toch eens proberen wat voor events asp.Net triggerd. Van begin tot eind, voor zowel de files die succesvol gedownload zijn als afgebroken zijn door de gebruiker. Ik hoop dat je daar wijzer uit wordt.

En laat iets weten aub, dan moet ik minder zoeken :9

Toch maar even wat zoekwerk gedaan (interesse is te groot :*) )

De zoekopdracht "file download completely" in de google group "Microsoft.public.dotnet.framework.aspnet" gaf me het volgende:

http://groups.google.be/g...hnow=Zoeken+in+deze+groep

De eerste link is wel interessant, maar toch niet heel simpel te implementeren lijkt me:
http://groups.google.be/g...y&rnum=1#88c95e05e6cc3bd6

[ Voor 27% gewijzigd door Vedett. op 23-02-2006 20:56 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
Vedett. schreef op donderdag 23 februari 2006 @ 20:30:
De zoekopdracht "file download completely" in de google group "Microsoft.public.dotnet.framework.aspnet" gaf me het volgende:

http://groups.google.be/g...hnow=Zoeken+in+deze+groep

De eerste link is wel interessant, maar toch niet heel simpel te implementeren lijkt me:
http://groups.google.be/g...y&rnum=1#88c95e05e6cc3bd6
Ik heb nu meerdere keren die eerste link gelezen, en dat lijkt aardig op wat ik op dit moment heb. Dus het bestand verzenden in Chunks.

Ik neem aan dat de evt. oplossing in de laatste post moet staan? Ik zie daar geen oplossing in. (of ik lees 'm echt helemaal verkeerd) Gebruiker klikt op link, bestand wordt gechunked aangeboden. Maar de request is al afgelopen, alleen de connectie is open. Serverside kan ik dan niets meer controleren.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024
Misschien heb je hier wat aan:
http://forums.asp.net/1176107/ShowPost.aspx
http://groups.google.be/g...=3&hl=nl#6e518ef95349416c

Die eerste is via streams, waar je de leuke functie "IsClientConnected" kan uitvoeren om te zien of er nog iemand luistert, en na afloop je in je DB wat kan gaan doen. Blijft natuurlijk de vraag of je server het leuk vindt om 1 GB door zijn geheugen te jagen.

edit:

Even een extra geheugenkronkel: als je je stream stukje per stukje inleest en uitspuwt naar de client, dan heb je uiteindelijk toch niet gans de file in-memory maar slechts x bytes?

[ Voor 18% gewijzigd door maartenba op 24-02-2006 12:54 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
Even een schopke:

Hier vond ik een interessant artikel, welke ik morgen even ga testen.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Vedett.
  • Registratie: November 2005
  • Laatst online: 12:18
Heb je al resultaten?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:47
Nog even heen en weer gemaild met de maker van dat script.
Doordat je al een output hebt, is het niet meer mogelijk om die voortgang te updaten. Dus dat script is voor mijn situatie nutteloos.
Verder heb ik nog geen reply gehad van de maker van het artikel op devx.com. Hij zou er naar kijken ;)

Dus echte resultaten zijn er niet.
De applicatie is inmiddels opgeleverd, maar voor het nageslacht wil ik dit wel opgelost hebben.

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1