import ftplib from java import awt from java import io as io import java import time import os import javax.swing as swing from javax.swing import SwingUtilities from javax.swing import filechooser from java.applet import Applet filename = '' def my_storlines(self, cmd, fp, callback=None): # patched for callback '''Store a file in line mode.''' #CRLF = ftplib.CRLF # patched for callback self.voidcmd('TYPE I') conn = self.transfercmd(cmd) while 1: buf = fp.read(1024) if not buf: break conn.sendall(buf) if callback: callback(buf) # patched for callback conn.close() return self.voidresp() ftplib.FTP.storlines = my_storlines # use the patched version class FTPProgressDialog: def __init__(self, fname, fc): #import wx, os statinfo = os.stat(fname) self.filesize = statinfo.st_size self.so_far = 0 self.dlg = UploadProgress(self.filesize, self.so_far) self.report = fc.report #self.app = wx.PySimpleApp() #self.dlg = wx.ProgressDialog("Upload progress", # fname+":", # maximum = self.filesize, # style = wx.PD_APP_MODAL # | wx.PD_ELAPSED_TIME # | wx.PD_ESTIMATED_TIME # | wx.PD_REMAINING_TIME # ) def asciicallback(self, buffer): """ just used for testing, w/o wxPython """ self.so_far = self.so_far+len(buffer)-1 pct = float(self.so_far)/self.filesize print "so far:", self.so_far, pct return def wxcallback(self, buffer): self.so_far = self.so_far+len(buffer)-1 self.dlg.Update(self.so_far) pct = float(self.so_far)/self.filesize self.report.text = "\nBytes uploaded so far: %d" % (self.so_far) return def close(self): java.lang.System.exit(0) #self.app.Destroy() class UploadProgress(awt.Canvas): def __init__(self, filesize, so_far): top_frame = awt.Frame(title="Progress", size=(500, 75), windowClosing=lambda e: java.lang.System.exit(0)) top_frame.add(self) top_frame.visible = 1 self.so_far = so_far self.filesize = filesize self.show() def finished(self): self.so_far = self.filesize self.repaint() def Update(self, so_far): self.so_far = so_far self.repaint() def paint(self, g): percent_complete = (self.so_far * 100.0 / self.filesize) pixel_width = (self.width * self.so_far) / self.filesize if(percent_complete == 100): g.color = awt.Color.green else: g.color = awt.Color.blue g.fillRect (0, 0, pixel_width, self.height) s = "%d %%" % percent_complete if(percent_complete < 49): g.color = awt.Color.black else: g.color = awt.Color.white if(percent_complete == 100): g.color = awt.Color.black fm = g.getFontMetrics(g.font) g.drawString(s, (self.width - fm.stringWidth(s))/2, 24) def exit(event): java.lang.System.exit(0) class FileChooser(swing.JFrame): def __init__(self, title="Please choose a file to upload", size=(800, 30)): swing.JFrame.__init__(self, title, size=size, windowClosing = exit) self.contentPane.layout = awt.FlowLayout() self.field = swing.JTextField(preferredSize=(200,20)) self.contentPane.add(self.field) self.me_button = swing.JButton('Go', preferredSize=(100, 20), actionPerformed=self.setFilename) self.contentPane.add(self.me_button) self.value = 0 self.pack() def setFilename(self, event): self.me_button.enabled = 0 self.field.enabled = 0 self.value = 1 class choozafile(swing.JFrame): def __init__(self, title="Please choose a file to upload", size=(450, 120)): swing.JFrame.__init__(self, title, size=size, windowClosing = exit) self.contentPane.layout = awt.BorderLayout() self.top_panel = swing.JPanel(preferredSize=(400,40)) self.top_panel.layout = awt.FlowLayout() self.bot_panel = swing.JPanel(preferredSize=(400,40)) self.bot_panel.layout = awt.FlowLayout() self.field = swing.JTextField(preferredSize=(200,20)) self.contentPane.add(self.top_panel, awt.BorderLayout.NORTH) self.contentPane.add(self.bot_panel, awt.BorderLayout.SOUTH) self.top_panel.add(self.field) #self.go_button = swing.JButton('Go', preferredSize=(100, 20), actionPerformed=self.set_filename) self.browse_button = swing.JButton('Browse', preferredSize=(100, 20), actionPerformed=self.chooza) self.top_panel.add(self.browse_button) self.report = swing.JTextField(preferredSize=(300,30)) self.bot_panel.add(self.report,awt.BorderLayout.WEST) #self.contentPane.add(self.go_button) self.value = 0 #self.go_button.enabled = 0 self.pack() def chooza(self, event): self.fc = swing.JFileChooser() self.fc.setFileSelectionMode(swing.JFileChooser.FILES_ONLY) self.return_val = self.fc.showDialog(self.contentPane, 'Select'); if self.return_val == swing.JFileChooser.APPROVE_OPTION: self.field.text = self.fc.getSelectedFile().getName() #getAbsoluteFile().toString() self.field.enabled = 0 self.browse_button.enabled = 0 self.value = 1 def set_filename(self, event): #self.go_button.enabled = 0 self.field.enabled = 0 self.value = 1 class ftp_uploader(Applet): fc = choozafile() fc.show() while 1: filename = fc.field.text report = fc.report if fc.value == 1: if not filename == '': break try: ftpconn = ftplib.FTP("ftp.test-site.ws") ftpconn.login('test-site-ws_ftp','') report.text = "Logged in.. ftp://%s:%s@%s\n" % ('test-site-ws_ftp','******',"ftp.test-site.ws") f = open(filename, 'rb') FTPprogress = FTPProgressDialog(filename, fc) ftpconn.storlines("STOR "+ filename, f, callback=FTPprogress.wxcallback) report.text = 'File uploaded successfully..' FTPprogress.dlg.finished() ftpconn.quit except: report.text = 'Sorry an error occurred. Upload failed.' #FTPprogress.close()