Mangiare Senza Glutine disponibile su App Store

Per altre informazioni scrivi a fabriziocaldarelli@negusweb.it

Upload FTP da pagina web tramite applet Java

Da Programmazione Software.

PHP, ASP, JSP e qualsiasi altro linguaggio per il web supporta pienamente, tramite il protocollo HTTP, l'invio di files tramite pagina web. Il problema principale nell'utilizzare la tecnologia esistente tramite protocollo HTTP è la dimensione del file trasferibile prima che il server risponda con un timeout. Non solo. Durante l'invio di files di grandi dimensioni il fatto di non avere una barra progressiva che indichi la percentuale di file trasferito può creare un certo disorientamento all'utente che non sa se l'applicativo è in stallo o sta lavorando. Eventuali tecnologie quali Ajax anche in questo caso falliscono perchè come succede ad esempio in PHP, il percorso del file temporaneo di appoggio sul server è conosciuto solo ad upload ultimato. Tutte queste motivazioni mi hanno spinto a scrivere una semplice applet che fa uso del package (non ufficiale) FtpClient per effettuare, tramite pagina web, una connessione diretta FTP al sito e fare direttamente l'upload. L'applet come potete immaginare è abbastanza semplice, come semplice è l'interfaccia utente, costituita da oggetti AWT ed una progress bar realizzata tramite Canvas, con una classe dedicata. L'applicazione contiene anche un parametro "id_utente", passato dalla pagina web all'applet, che consente di preporre prima del nome del file un eventuale "id_utente" da associare al file in modo che in caso di upload autenticato consente di distinguere gli upload fatto dal singolo utente. Qui di seguito riporto il codice dei singoli files e poi in coda il package completo ed il progetto Eclipse completo che potete utilizzare, ridistribuire e modifcare (sono gradite segnalazioni in tutti i casi, almeno per sapere che il pacchetto è utile anche a qualcun'altro ) liberamente. Vi riporto la lista dei files che leggerete:


UploadFtp.java

package UploadFtp;
 
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
 
public class UploadFtp extends Applet implements ActionListener, FtpClientSystemDownloadListener
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
 
	Label lblPathFile;
	Button btnCerca, btnUpload;
	CanvasProgressBar progressBar;
	Thread threadDownload;
 
	String directory, nomeFile;
 
	public void init()
	{
		lblPathFile= new Label("FILE: ---");
			lblPathFile.setPreferredSize(new Dimension(200,10));
		btnCerca = new Button("CERCA");
			btnCerca.addActionListener(this);
		btnUpload = new Button("UPLOAD");
			btnUpload.addActionListener(this);
		btnUpload.setEnabled(false);
 
		progressBar = new CanvasProgressBar();
		progressBar.setSize(200,40);
 
		Panel pan11 = new Panel();
			pan11.add(lblPathFile);
		Panel pan12 = new Panel();
			pan12.add(btnCerca);
			pan12.add(btnUpload);
		Panel pan13 = new Panel();
			pan13.add(progressBar);
		Panel pan1 = new Panel(new GridLayout(3,1));
		pan1.add(pan11);
		pan1.add(pan12);
		pan1.add(pan13);
		this.add(pan1);
	}
 
	private void UploadFile(String directory, String nomeFile)
	{
		int idUtente;
		String strIdUtente = this.getParameter("id");
		idUtente = 0;
		if (strIdUtente != null) idUtente = Integer.parseInt(strIdUtente);
 
		threadDownload = new Thread(new FtpClientSystemUploadFile(this, directory, nomeFile, idUtente));
		threadDownload.start();
	}
 
	public void downloadCompletato(long bytesTotali)
	{
		this.directory="";
		this.nomeFile="";
		this.lblPathFile.setText("FILE: ---");
		this.btnCerca.setEnabled(true);
		this.btnUpload.setEnabled(false);
	}
 
	public void downloadListener(long bytesInviati, long bytesTotali)
	{
		progressBar.setPercentuale((int) ((bytesInviati*100/bytesTotali)));
		//System.out.println(bytesInviati + " "+bytesTotali + " "+  ((int) ((bytesInviati*100/bytesTotali))));
	}
 
	public void actionPerformed(ActionEvent ae)
	{
		String fileSeparator = System.getProperty("file.separator");
 
		if (ae.getActionCommand().equals("UPLOAD"))
		{
			UploadFile(this.directory, this.nomeFile);
			this.btnCerca.setEnabled(false);
			this.btnUpload.setEnabled(false);
		}
 
		if (ae.getActionCommand().equals("CERCA"))
		{
			FileDialog fd = new FileDialog((Frame) null);
			fd.setVisible(true);
			if (fd.getFile()!=null)
			{
				this.directory = fd.getDirectory();
				this.nomeFile = fd.getFile();
				this.lblPathFile.setText("FILE: "+this.directory+fileSeparator+this.nomeFile);
				btnUpload.setEnabled(true);
			}
		}
	}
	public void start()
	{
		this.setVisible(true);
	}
	public void stop()
	{
 
	}
	public void destroy()
	{
 
	}
}


FtpClientSystemUploadFile.java

package UploadFtp;
 
class FtpClientSystemUploadFile implements Runnable
{
	private FtpClientSystemDownloadListener downloadLister;
	private String directory;
	private String nomeFile;
	private int idUtente;
 
	private void UploadFile()
	{
		try
		{
			FtpClientSystem f = new FtpClientSystem("ftp.tuohost.it","tua_username","tua_password","/cartella_di_destinazione", idUtente);
			f.connect();
			f.addDownloadListener(this.downloadLister);
			f.putFile(this.directory,this.nomeFile);
		}
		catch(Exception e ) { e.printStackTrace(); }
	}
 
	public FtpClientSystemUploadFile(FtpClientSystemDownloadListener dl, String directory, String nomeFile, int idUtente)
	{
		this.downloadLister = dl;
		this.directory = directory;
		this.nomeFile = nomeFile;
		this.idUtente = idUtente;
	}
 
	public void run()
	{
		this.UploadFile();
	}
}


FtpClientSystemDownloadListener.java

package UploadFtp;
 
public interface FtpClientSystemDownloadListener
{
	public void downloadListener(long bytesInviati, long bytesTotali);
	public void downloadCompletato(long bytesTotali);
}


FtpClientSystem.java

package UploadFtp;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.*;
import sun.net.TelnetInputStream;
import sun.net.ftp.FtpClient;
 
public class FtpClientSystem {
 
	public static int BUFFER_SIZE = 10240;
 
	private FtpClient m_client;
 
	  // set the values for your server
 
	private String host;
 
	private String user;
 
	private String password;
 
	private String sDir;
 
	private String m_sLocalFile;
 
	private String m_sHostFile;
 
	private int m_idUtente;
 
	private Vector vecDownloadListener;
 
	public void addDownloadListener(FtpClientSystemDownloadListener dl)
	{
		this.vecDownloadListener.add(dl);
	}
 
	public void connect()
	{
		try 
		{
			//System.out.println("Connecting to host " + host);
			m_client = new FtpClient(host);
			m_client.login(user, password);
			//System.out.println("User " + user + " login OK");
			//System.out.println(m_client.welcomeMsg);
			m_client.cd(sDir);
			//System.out.println("Directory: " + sDir);
			m_client.binary();
			//System.out.println("Success.");
		} 
		catch (Exception ex) { System.out.println("Error: " + ex.toString());  }
  }
 
  public FtpClientSystem(String host, String user, String password, String sDir, int idUtente) 
  {
	  this.host = host;
	  this.user = user;
	  this.password = password;
	  this.sDir = sDir;
	  this.m_idUtente = idUtente;
	  this.vecDownloadListener = new Vector();
  }
 
  protected void disconnect() 
  {
	  if (m_client != null) {
		  try {
			  m_client.closeServer();
		  } catch (IOException ex) {
	  }
	  m_client = null;
	}
  }
 
  public static int getFileSize(FtpClient client, String fileName)
  throws IOException 
  {
	  TelnetInputStream lst = client.list();
	  String str = "";
	  fileName = fileName.toLowerCase();
	  while (true) {
		  int c = lst.read();
		  char ch = (char) c;
		  if (c < 0 || ch == '\n') {
			  str = str.toLowerCase();
			  if (str.indexOf(fileName) >= 0) {
				  StringTokenizer tk = new StringTokenizer(str);
				  int index = 0;
				  while (tk.hasMoreTokens()) {
					  String token = tk.nextToken();
					  if (index == 4)
						  try {
							  return Integer.parseInt(token);
						  } catch (NumberFormatException ex) {
							  return -1;
						  }
						  index++;
				  }
			  }
			  str = "";
		  }
		  if (c <= 0)
			  break;
		  str += ch;
	  }
	  return -1;
  }
 
  protected void getFile()
  {
	  if (m_sLocalFile.length() == 0) {
		  m_sLocalFile = m_sHostFile;
	  }
	  byte[] buffer = new byte[BUFFER_SIZE];
	  try {
		  int size = getFileSize(m_client, m_sHostFile);
		  if (size > 0) {
			  System.out.println("File " + m_sHostFile + ": " + size
					  + " bytes");
			  System.out.println(size);
		  } else
			  System.out.println("File " + m_sHostFile + ": size unknown");
		  FileOutputStream out = new FileOutputStream(m_sLocalFile);
		  InputStream in = m_client.get(m_sHostFile);
		  int counter = 0;
		  while (true) {
			  int bytes = in.read(buffer);
			  if (bytes < 0)
				  break;
 
			  out.write(buffer, 0, bytes);
			  counter += bytes;
		  }
		  out.close();
		  in.close();
	  } catch (Exception ex) {
		  System.out.println("Error: " + ex.toString());
	  }
  }
 
  protected void putFile(String directory, String nomeFile) 
  {
	  String fileSeparator = System.getProperty("file.separator");
 
	  String pathFile = directory + fileSeparator + nomeFile;
 
	  this.m_sLocalFile = pathFile;
	  this.m_sHostFile = "/cartella_di_destinazione/"+String.valueOf(this.m_idUtente)+"_"+nomeFile;
 
	  if (m_sLocalFile.length() == 0) {
		  System.out.println("Please enter file name");
	  }
	  byte[] buffer = new byte[BUFFER_SIZE];
	  try {
		  File f = new File(m_sLocalFile);
		  int size = (int) f.length();
		  System.out.println("File " + m_sLocalFile + ": " + size + " bytes");
		  System.out.println(size);
		  FileInputStream in = new FileInputStream(m_sLocalFile);
		  OutputStream out = m_client.put(m_sHostFile);
 
		  int counter = 0;
		  while (true) {
			  int bytes = in.read(buffer);
			  if (bytes < 0)
				  break;
			  out.write(buffer, 0, bytes);
			  counter += bytes;
			  BroadcastDownloadListener(counter, size);
			  //System.out.println(counter);
		  }
		  BroadcastDownloadCompletato(size);
 
		  out.close();
		  in.close();
	  } catch (Exception ex) {
		  System.out.println("Error: " + ex.toString());
	  }
  }
 
  	public void BroadcastDownloadListener(int bytesInviati, int bytesTotali)
  	{
  		for(FtpClientSystemDownloadListener dl : this.vecDownloadListener)
  		{
  			dl.downloadListener(bytesInviati, bytesTotali);
  		}
  	}
 
  	public void BroadcastDownloadCompletato(int bytesTotali)
  	{
  		for(FtpClientSystemDownloadListener dl : this.vecDownloadListener)
  		{
  			dl.downloadCompletato(bytesTotali);
  		}
  	}
 
}


CanvasProgressBar.java

package UploadFtp;
 
import java.awt.*;
 
public class CanvasProgressBar extends Canvas
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	int percentuale = 0;
 
	public void setPercentuale(int percentuale)
	{
		this.percentuale = percentuale;
		this.repaint();
	}
 
	public void paint(Graphics g)
	{
		int w, h, val;
 
		w = 180;
		h = 30;
		val = (int) (w*this.percentuale/100);
 
		g.setColor(Color.RED);
		g.drawRect(0,0, w, h);
		g.fillRect(0,0, val, h);
		g.setColor(Color.BLACK);
		g.drawString(String.valueOf(this.percentuale)+"%", (int)(w/2), (int) (h/2));
	}
}

Scrivetemi per segnalarmi errori, malfunzionamenti, bug o miglioramenti.


Allegati