Avatar billede kkaen Nybegynder
12. november 2008 - 14:02 Der er 14 kommentarer og
1 løsning

Upload af fil

Jeg har lavet et program, hvori jeg kan uploade en fil til en server (IIS7). Til valg af lokal fil bruger jeg en FileUpload-kontrol. Til selve det at gemme objektet på serveren benytter jeg nogle klasser, som jeg selv har lavet.
Jeg har lavet en WPF-applikation, hvor klasserne til at gemme filen på serveren virker. Men når jeg prøver gennem aspx, så får jeg fejlen:

FIleNotFoundException: c:ProgramFiles\MicrosoftVisualStudio9\Common7\IDE\file.txt

Hvordan kan det være? Jeg har da slet ikke en reference til det bibliotek. Er det noget, jeg ikke har sat rigtigt op? Jeg har været inde og give alle brugere maksimale rettigheder, så jeg kan ikke se, hvor problemet skulle være.
Avatar billede kkaen Nybegynder
12. november 2008 - 14:19 #1
Kommandoen, hvor jeg prøver at gemme filen på serveren med, er:

Program.saveFileOnServer(serverService, filNavn);

og den metode, som den kommando bruger er:

static public void saveFileOnServer(IService1 mathClient, string fileArg)
{
    using (FileStream fs = new FileStream(fileArg, FileMode.Open))
    {
          byte[] buffer = new byte[65000];
          int bytesRead = 0;
          // iterate through the file filling a buffer and sending it to the service
          while ((bytesRead = fs.Read(buffer, 0, 65000)) > 0)
          {
                int lastIndexOfSlash = fileArg.LastIndexOf('\\');
                string onlyFile = fileArg.Substring(lastIndexOfSlash);
                mathClient.AppendFile(onlyFile, buffer, 0, bytesRead);
            }
        }
}

Det er som om, at FileUpload-kontrollen ikke peger på det bibliotek, hvor den pågældende fil ligger, men derimod peger på det bibliotek, hvor applikationen bliver afviklet i. Hvis jeg ikke er helt galt på den, hvordan løser jeg så dette?
Avatar billede kkaen Nybegynder
12. november 2008 - 20:41 #2
Jeg har nu prøvet med FileUpload.save, hvor jeg angiver fulde lokale sti til hvor filen skal gemmes. Og det virker fint. Vil det så sige, at WCF ikke kan bruges til net-applikationer? Ikke engang aspx-sider, hvor man kan skrive "runat=
server'"?
Avatar billede aaberg Nybegynder
13. november 2008 - 12:18 #3
Alt kode i en aspx side bliver kørt på serveren, og den har ingen tilgang til klientens filsystem. Grunden til at det virker i en WPF app, er at WPF applikationer kører på klienten. Når du tilføjer en fileupload kontrol til en aspx side, bliver filen sendt med i din postback, og serveren har mulighed for at gemme filen.

WCF er et hjælpemiddel til kommunikation via forskellige protokoller. Selvom du bruger WCF bliver du stadig nød til at kende muligheder og begrænsninger på de protokoller der bliver brugt.

Tænk hvis du bare uden videre fra din server kunne hente en fil fra klienten! Så havde du fundet historiens største sikkerhedshuld i klientens browser!
Avatar billede kkaen Nybegynder
13. november 2008 - 21:24 #4
Ja, det er selvfølgelig rigtigt. Men jeg troede nu, at netop WCF gav mulighed for kommunikation på den led, at hvis klienten vælger at tage brug af muligheden, så er der en åben kanal til data-transport.
Avatar billede aaberg Nybegynder
13. november 2008 - 22:54 #5
Nope, en browser ville aldrig tillade sådan en form for kommunikation.
Avatar billede kkaen Nybegynder
14. november 2008 - 20:19 #6
Men hvad så hvis man på klient-siden benytter en teknologi, som giver flere rettigheder - f.eks. Java Web Start, Isolated Storage eller lignende?
Avatar billede aaberg Nybegynder
14. november 2008 - 20:29 #7
Hvis du på klienten bruger WPF vil det virke, men det har du jo fundet ud af. Med hensyn til de andre ting du nævner, så ved jeg ikke nok om dem til at kunne svare på det, desværre.
Avatar billede aaberg Nybegynder
14. november 2008 - 20:30 #8
For at det skal virke, bliver koden nok nød til at køre på klienten.
Avatar billede kkaen Nybegynder
14. november 2008 - 23:40 #9
Men når klienten kan sende data ud (requests m.m.), så kan klienten vel også sende data gennem bestemte kommunikations-kanaler, hvis sikkerheden tillader det?

Findes der ikke noget online dokumentation omkring dette emne?
Avatar billede aaberg Nybegynder
15. november 2008 - 16:33 #10
Klienten kan sende data, så længe du har noget kode kørende på klienten som håndterer det. En webserver kan ikke requeste data fra en klient, da dette vil blive blokeret. En tommelfingerregel er, at klienten altid skal tage initiativet til en dataoverførsel.

Jeg kender desværre ikke noget online dokumentation omkring dette.
Avatar billede arne_v Ekspert
15. november 2008 - 20:23 #11
Fil upload over internet er:

client program-----(HTTP)-----server side script

hvor client program kan være en browser og hvor server side script kan være en ASP.NET
side med FileUpload kontrollen.

Client programmet kunne også være en desktop app skrevet i C# som er installeret på
PC'en. Klasserne WebClient og (Http)WebRequest kan sende en HTTP POST request
til din ASP.NET side som emulerer det browseren sender.

Af åbenlyse sikkerhedshensyn så kan man ikke bare lade noget kode embedded i en web side få
fuld adgang til client PC'ens harddisk.

En rimelig almindelig måde at give den adgang på er via en signed Java applet. Når
den kører så bliver brugeren promptet om man vil give den privs og hvis han svarer
ja, så har den adgang til hard disken.

Man kan nemt lave en upload applet som bruger (Http)URLConnection klassen som uploader
til din ASP.NET side.

Bemærk at det ikke er muligt at grante den nødvendige adgang på en Windows Vista maskine med UAC
slået til !

Du kan godt erstatte simpel HTTP POST med SOAP/HTTP. Server er så ikke en ASP.NET
side med FileUpload kontrol, men en WCF web service med den rette binding. Client kan
så være en C# desktop app med stub genereret af WCF - eller noget lavet i et andet
sprog.

Men:
- du kan ikke bruge din ASP.NET side kode
- det løser ikke client side privs problemet
- SOAP/HTTP er mindre egnet end simpel HTTP POST til at uploade filer med
så jeg kan ikke se nogen pointe i at bruge WCF.
Avatar billede kkaen Nybegynder
24. november 2008 - 20:11 #12
Okay. Det lyder jo som om, at jeg efterhånden må opgive den ide om, at wcf'en kan benyttes gennem en browser så...
Avatar billede arne_v Ekspert
19. januar 2009 - 01:31 #13
Tid at få afsluttet her ?
Avatar billede kkaen Nybegynder
22. januar 2009 - 16:05 #14
Jo, men så må du jo lægge et svar som følge af 15/11-2008 20:23:10 ;-)
Avatar billede arne_v Ekspert
22. januar 2009 - 17:15 #15
ok
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
Kurser inden for grundlæggende programmering

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