Gå til innhold

Anbefalte innlegg

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 av HDSoftware
Lenke til kommentar
Videoannonse
Annonse

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

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

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

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

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 av ChristianW
Lenke til kommentar

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...