HDSoftware Skrevet 25. august 2009 Del Skrevet 25. august 2009 (endret) Heisan folkens Jeg har laget en WEB side som jeg vil skal kunne støtte en slags FTP variant Vi har nemlig en FTP server som vi vil lagre alle filer som ikek er del av WEB sidene, eksempelvis oppdateringer av programmene vi lager og andre former for dokumener. Disse sidene ligger altså på et FTP område, men jeg vil at man via et ASP grensesnitt skal kunne laste opp til denne FTP serveren. Å lage dette for en vanlig WinForm klient er ikke noe problem, men jeg vil at lokale disker skal kunne brukes av brukeren av web siden. Er dette en enkel affære tro? Endret 25. august 2009 av HDSoftware Lenke til kommentar
Wattengård Skrevet 2. september 2009 Del Skrevet 2. september 2009 Noen spesiell grunn til at det ikke er nok med en vanlig fileupload tjeneste? -- Du kan jo la brukerne laste opp filen til nettstedet, mellomlagre den, og deretter kjøre en lokal tjeneste som laster filen videre inn på ftp-servern. -C- Lenke til kommentar
HDSoftware Skrevet 2. september 2009 Forfatter Del Skrevet 2. september 2009 Ser ikke helt hva du mener. Det er jo nettop dette jeg prøver å få til. Jeg vil at brukeren skal kunne laste opp. Men for å slippe å lære noen å bruke en FTP klient samt at jeg slipper å fortelle noen hva FTP kontoen er etc. etc. så tenkte jeg at jeg like greit lagde dette direkte i WEB siden. Det vil si at all nødvendig info om pålogging ligger i databasen.... og igjen - dette fungerer helt knirkefritt på min dev. maskin så jeg skjønner ikke hvorfor det ikke virker på vår public WEB server. Flere tips mottas med stor takk... Lenke til kommentar
norpheus Skrevet 2. september 2009 Del Skrevet 2. september 2009 Du må nok, som nevnt over, lage en vanlig fileupload tjeneste og kjøre en lokal tjeneste på serveren som overfører filene til FTP serveren. Hvis du lage en client-side sak som gjør dette, vil de fleste få spørsmål fra brannmuren om de vil tillate tilkoblingen. Lenke til kommentar
HDSoftware Skrevet 2. september 2009 Forfatter Del Skrevet 2. september 2009 Det spiller ingen rolle fordi alt dette skjer "inhouse". Når dere sier "Lage en vanlig fileupload", hva er forskjellen på det og det jeg faksitk har laget? Skjønner ikke helt at en FTP tilkobling ikke er en fileupload.... Lenke til kommentar
Wattengård Skrevet 2. september 2009 Del Skrevet 2. september 2009 Jeg skjønner ikke hvorfor du på død å liv skal benytte en ftp-tjeneste? En FTP-tjeneste er en egen tjeneste som går over en egen protokoll og må ha sin egen server og sin egen klient. Når vi sier fileupload så tenker vi på en tjeneste a'la "drop.io", eller enkelt og greit avatarfunksjonen på et forum. Bare at du har den på din egen server. Her brukes HTTP-protokollen til all kommunikasjon. Hvis du fortsatt ønsker å benytte en ftp-tjeneste for lagring så må du ha en funksjon på din server som tar filen som brukeren har lastet opp via en slik tjeneste og laster den inn på ftp-serveren. Men det må da være like greit å lagre filene i en bestemt katalog, og lagre metadata i databasen? -C- Lenke til kommentar
norpheus Skrevet 2. september 2009 Del Skrevet 2. september 2009 Du har to muligheter: En vanlig fileuploader kjører i browseren, feks en enkel form som man submitter. Fila sendes da til WEBserveren og den må da behandle denne videre, feks sende den til FTPserveren. Dette krever ingen spesifikk godkjenning av brukeren, da scripts i nettleseren ikke har tilgang til lagring som default (brukeren må selv trykke "Bla gjennom" for å finne filene). Hvis du fra nettleseren vil kunne sende fila DIREKTE til FTPserveren, må klientmaskinen opprette sin egen tilkobling til FTPserveren. Dette kan ikke gjøres via javascript eller liknende i en nettleser, dette må gjøres via en applikasjon (feks Java Applet). Applikasjonen må i tillegg godkjennes av brukeren slik at den får tilgang til lagring og nettverk. Lenke til kommentar
HDSoftware Skrevet 2. september 2009 Forfatter Del Skrevet 2. september 2009 Ok. Da kan jeg bekrefte at det er det første alternativet jeg har laget. Brukeren får presentert en "Browse" knapp om tillater henting av fil på lokal maskin. Dette er en standard ASP.NET kontroll. Så har brukeren en knapp som sier "Upload". Denne knappen kjører et C# program (på serveren) som laster opp ved å bruke FTP. Her er koden: FtpWebRequest ftpWR; FtpWebResponse ftpWP; try { // Get FTP WEB request object ftpWR = FtpWebRequest.Create(new Uri(ftp.URI + "/" + ftp.FTPPath + "/" + pFileName.FileName)) as FtpWebRequest; ftpWR.UseBinary = true; ftpWR.Method = WebRequestMethods.Ftp.UploadFile; ftpWR.Credentials = new NetworkCredential(ftp.UserName, ftp.Password); // Get Physical File FileInfo fi = new FileInfo(pFileName.PostedFile.FileName); Byte[] contents = new byte[fi.Length]; // Read File FileStream fs = fi.OpenRead(); fs.Read(contents, 0, Convert.ToInt32(fi.Length)); fs.Close(); // Write file contents to FTP server Stream rs = ftpWR.GetRequestStream(); rs.Write(contents, 0, Convert.ToInt32(fi.Length)); rs.Close(); ftpWP = ftpWR.GetResponse() as FtpWebResponse; } catch(WebException webExc) { } catch(Exception ex) { } Som sagt så fungerer dette altså helt greit på min dev maskin. Med andre ord så er den "eneste" forskjellen at når jeg kjører så er WEB serveren en del av min maskin gjennom Visual Studio Lenke til kommentar
Wattengård Skrevet 2. september 2009 Del Skrevet 2. september 2009 (endret) Det er jo ikke så rart. Du kan ikke hente filer fra klienter med server-side skript. Grunnen til at det funker på dev-maskinen er at der er det jo faktisk korrekt filnavn. Når du prøver å kjøre den der på serveren så prøver den jo å hente filen fra serveren. Det er iallefall slik det ser ut ut i fra koden din. Men nå vet jo ikke jeg hva "ftp" objektet er fornoe, eller hva "pFileName" objektet er fornoe. Du må skille mellom server-side og client-side koding. Slik som du gjør det nå så har du implementert en ftp-klient på serveren. Det hjelper deg ikke. EDIT: Ser at det kanskje var dårlig forklart i det første avsnittet. Det jeg mener er at når du kjører denne på din dev-maskin så vil "C:\katalog\fil.navn" være en gyldig bane for server-skriptet. Men når du kjører den på serveren, og en bruker browser til "C:\Mine bilder\Bilde1.jpg" så vil ikke det funke. For ftp-klienten som du har implementert vil lete etter "C:\Mine bilder\Bilde1.jpg" på sin egen disk. Du må nok først laste opp filen via http, mellomlagre den, så evt laste den inn på ftp'en. -C- Endret 2. september 2009 av ChristianW Lenke til kommentar
HDSoftware Skrevet 2. september 2009 Forfatter Del Skrevet 2. september 2009 hmm, begynner å se tegninga, men da er jo ASP:FileUpload helt ubrukelig i dette tilfellet da, med mindre man først overfører til server. Jeg var sikker på at ASP:FileUpload gjorde alt dette selv, men det gjør den altså ikke. Synd.... btw - var litt klønete av meg å ikke fortelle om objektene. pFileName er en referanse til ASP:FileUpload og at ftp er en record i tabellen FTPServers som inneholder URL, pologgings navn og passord etc.. Lenke til kommentar
Wattengård Skrevet 2. september 2009 Del Skrevet 2. september 2009 http://msdn.microsoft.com/en-us/library/ms227669.aspx Les den og prøv igjen -C- Lenke til kommentar
HDSoftware Skrevet 2. september 2009 Forfatter Del Skrevet 2. september 2009 AHHHH!!!! Den lille detaljen ".PostedFile.SaveAs(..." gjorde susen. Millioner takk ;-) Her er forresten koden til de som måtte ha behov for dette senere: internal void Upload(A2.Classes.DataAccess.FTPServere ftp, System.Web.UI.WebControls.FileUpload pFileName, string pServerTempPath) { FtpWebRequest ftpWR; FtpWebResponse ftpWP; bool TempFileExist = false; string tempFileName = Guid.NewGuid().ToString() + ".tmp"; try { // Nead to save the file on the server first pFileName.PostedFile.SaveAs(pServerTempPath + tempFileName); TempFileExist = true; // Get FTP WEB request object ftpWR = FtpWebRequest.Create(new Uri(ftp.URI + "/" + ftp.FTPPath + "/" + pFileName.FileName)) as FtpWebRequest; ftpWR.UseBinary = true; ftpWR.Method = WebRequestMethods.Ftp.UploadFile; ftpWR.Credentials = new NetworkCredential(ftp.UserName, ftp.Password); // Get Physical File FileInfo fi = new FileInfo(pServerTempPath + tempFileName); Byte[] contents = new byte[fi.Length]; // Read File FileStream fs = fi.OpenRead(); fs.Read(contents, 0, Convert.ToInt32(fi.Length)); fs.Close(); // Write file contents to FTP server Stream rs = ftpWR.GetRequestStream(); rs.Write(contents, 0, Convert.ToInt32(fi.Length)); rs.Close(); ftpWP = ftpWR.GetResponse() as FtpWebResponse; } catch (WebException webExc) { } catch (Exception ex) { } finally { if (TempFileExist) { try { FileInfo f = new FileInfo(pServerTempPath + tempFileName); if (f.Exists) File.Delete(pServerTempPath + tempFileName); } catch (FileNotFoundException ex) { string e = ex.ToString(); } catch (Exception ex) { string e = ex.ToString(); } } } } Kalles fra WEB Form codebehind slik: protected void btnUpload_Click(object sender, EventArgs e) { ftp.Upload(ftpServer, txtFileToUpload, Server.MapPath("~/Temp/")); } Lenke til kommentar
Wattengård Skrevet 2. september 2009 Del Skrevet 2. september 2009 Det fins en egen funksjon i System.IO.Path som heter GetTempFileName() som automatisk gir deg et gyldig filnavn for en midlertidig fil. -C- Lenke til kommentar
HDSoftware Skrevet 2. september 2009 Forfatter Del Skrevet 2. september 2009 Ja, det har du rett i. Har vel egentlig brukt den tidligere i et annet prosjekt. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå