mina-ftpserver-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Zhu, Yan-Bo (TSG-GDCC-CD)" <yanbo....@hp.com>
Subject Re: implement a ftplet to limit the size of upload files
Date Wed, 21 Oct 2009 09:38:32 GMT
I'v figured out a implementation by copy the sourcecode in STOR.java to my Ftplet's onUpload
method.
The following the sourcecode ,pls notice the "//" at the start of some lines ,
Some changes are needed:
1, LocalizedFtpReply.translate(....)method is not usable in ftplet, 
2, create a new FilterOutputStream object and pass it to transferFromClient to limit the size
.
When I test from a ftp client ,it seems like that the result is what I want .
But I'm not sure there is no bug because I'm not fully understand the code I commented by
"//".

Could someone give me some suggestions?
Thanks.
::::::::::::::::::::::::::::
		 try {

            // get state variable
            long skipLen = session.getFileOffset();

            // argument check
            String fileName = request.getArgument();
            if (fileName == null) {
                session
                        .write(new DefaultFtpReply(
                                        FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS,
                                        "STOR REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS"));
                return  FtpletResult.SKIP;
            }
	
//            // 24-10-2007 - added check if PORT or PASV is issued, see
//            // https://issues.apache.org/jira/browse/FTPSERVER-110
//            DataConnectionFactory connFactory = session.getDataConnection();
//            if (connFactory instanceof IODataConnectionFactory) {
//                InetAddress address = ((IODataConnectionFactory) connFactory)
//                        .getInetAddress();
//                if (address == null) {
//                    session.write(new DefaultFtpReply(
//                            FtpReply.REPLY_503_BAD_SEQUENCE_OF_COMMANDS,
//                            "PORT or PASV must be issued first"));
//                    return;
//                }
//            }
        
            // get filename
            FtpFile file = null;
            try {
                file = session.getFileSystemView().getFile(fileName);
            } catch (Exception ex) {
                System.out.println("Exception getting file object"+ ex);
            }
            if (file == null) {
                session.write(new DefaultFtpReply(
                        FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN,
                        "STOR.REPLY_550_REQUESTED_ACTION_NOT_TAKEN"));
                return FtpletResult.SKIP;
            }
            fileName = file.getAbsolutePath();

            // get permission
            if (!file.isWritable()) {
                session.write(new DefaultFtpReply(
                        FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN,
                        "STOR.REPLY_550_REQUESTED_ACTION_NOT_TAKEN"));
                return FtpletResult.SKIP;
            }

            // get data connection
            session.write(
                   new DefaultFtpReply(
                            FtpReply.REPLY_150_FILE_STATUS_OKAY, "STOR.REPLY_150_FILE_STATUS_OKAY"))
//               .awaitUninterruptibly(10000)
				;

            DataConnection dataConnection;
            try {
                dataConnection = session.getDataConnection().openConnection();
            } catch (Exception e) {
                session.write(new DefaultFtpReply(
                        FtpReply.REPLY_425_CANT_OPEN_DATA_CONNECTION, "STOR.REPLY_425_CANT_OPEN_DATA_CONNECTION"
                        ));
                return FtpletResult.SKIP;
            }

            // transfer data
            boolean failure = false;
            OutputStream outStream = null;
            try {
                outStream = file.createOutputStream(skipLen);
				final int writelimit = 2048;
                long transSz = dataConnection.transferFromClient(
					session, new FilterOutputStream( outStream){
					private  int count =0;
					public void write(int b) throws IOException {
							count++;
							if( count > writelimit ) throw new IOException ("Write too many bytes");
							out.write(b);
					}
					 
				});

                // attempt to close the output stream so that errors in 
                // closing it will return an error to the client (FTPSERVER-119) 
                if(outStream != null) {
                    outStream.close();
                }

                // notify the statistics component
//                ServerFtpStatistics ftpStat = (ServerFtpStatistics) context
//                        .getFtpStatistics();
//                ftpStat.setUpload(session, file, transSz);
		
                
            } catch (SocketException ex) {
                failure = true;
                session.write(new DefaultFtpReply(
                        FtpReply.REPLY_426_CONNECTION_CLOSED_TRANSFER_ABORTED,
                        "STOR.REPLY_426_CONNECTION_CLOSED_TRANSFER_ABORTED"));
            } catch (IOException ex) {
                failure = true;
                session
                        .write(new DefaultFtpReply(
                                        FtpReply.REPLY_551_REQUESTED_ACTION_ABORTED_PAGE_TYPE_UNKNOWN,
                                        "STOR.REPLY_551_REQUESTED_ACTION_ABORTED_PAGE_TYPE_UNKNOWN"));
            } finally {
                // make sure we really close the output stream
                outStream.close();
            }

            // if data transfer ok - send transfer complete message
            if (!failure) {
                session.write(new DefaultFtpReply(
                        FtpReply.REPLY_226_CLOSING_DATA_CONNECTION, "STOR.REPLY_226_CLOSING_DATA_CONNECTION"));

            }
        } finally {
//            session.resetState();
            session.getDataConnection().closeDataConnection();
        }

		}catch(Exception e) {
			System.out.println(e);
		}
		
		return FtpletResult.SKIP;



-------------------------------------------------------------------------------------------------
>>Topic: implement a ftplet to limit the size of upload files

>>Hi,

>>I need to limit the size of upload files ,are there any good suggestions?
>>Is implementing a ftplet possible to do this?

>>Thanks for the help!
>>Bob Zhu

Mime
View raw message