FileCatalystは、サードパーティのアプリケーションやワークフローに統合するための多くのオプションを提供します。 当社のSDKには、開発言語や環境のさまざまなコンポーネントの完全な範囲を誇っています。

要求トライアル

コンポーネント テクノロジー FileCatalyst製品
クライアントAPI JavaやC ++ *、iOSの*、Androidの*、.NET * 直接、ワークフロー
Javaアプレットは、JavaScript API Java Plug-inを持つ任意の最近のWebブラウザ 直接
リモート管理 Javaの、REST 直接、ワークフロー
CLI /シェルスクリプト コマンドライン* 直接、ワークフロー
C ++ API / CLI 非Javaコマンドライン・アンドAPI 直接
*ワークフローとWebメールファイルのエリアへとからの転送のみ。

開発キットは、当社の製品の基盤となるものです。 あなたが任意の正規の製品を所有している場合、開発キットはアドオンとしてライセンス供与することができます。 スタンドアロン開発では、SDKは、一般的にFileCatalystダイレクトへ追加されます。 しかしながら、いくつかのコンポーネントがFileCatalystワークフローと対話するように設計されます。

ウォッチSDKウェビナー

付属のダウンロード ここでの例のソースコード

クライアントAPI

私たちのよく文書化されたAPIは、加速ファイル転送のためのFileCatalystサーバへの接続を確立するために必要なすべてのメソッドへのアクセスを提供します。 コードのいくつかの短い線で、あなたが進行中であることができます。 デフォルト値は、あなたが高度な機能にアクセスすることを可能にするメソッド呼び出しの完全な範囲で、ほとんどの機能のために使用されています。

クライアントAPIはまた、プログラムFileCatalystワークフローやWebメールにジョブやファイルを提出することができます。

unlimited.fc.client.apiをインポート*。 輸入java.io. *; パブリッククラスUploadSample {公共の静的な無効メイン(文字列の引数[])は、例外{FCClient fcを=新しいFCClient(「192.168.1.30」、21)をスロー。 fc.setShowConsoleLog(真の); fc.initialize()。 fc.connect()。 fc.login(「匿名」、「me@email.com "); fc.setMode(TransferMode.UDP)。 //は同じ開始速度と目標速度を設定します。 輻輳が発生した場合には遅くなります。 fc.setStartRate(10000); fc.setTargetRate(10000); fc.setVerifyIntegrity(真の); TransferHookアップロード= fc.upload(新しいファイル( "C:/temp/500MB.zip")); (!upload.isTransferComplete()){//あなたは// TransferHookオブジェクトのさまざまなメソッドを使用して、ここにいくつかの進捗情報を表示することができながら、場合(upload.getStatusCode()== upload.TRANSFERRING){のSystem.out.println(アップロード.getPercent()+ "%" + upload.getRate()+ "Kbpsの"); } {(1000)のThread.sleepを試してみてください。 }キャッチ(InterruptedExceptionあるの例){}})(サーバfc.disconnectから切断//; //)(fc.finishをクリーンアップ。 }}
import unlimited.fc.client.api.*;
import java.io.*;
import java.util.*;
import java.util.Observable;
import java.io.IOException;
import unlimited.fc.com.FCException;

/**
 * This example illustrates the use of Observables to monitor a TransferHook object.
 */

public class UploadSampleAdvanced implements Observer {

  TransferHook upload = null;

  public void go() throws IOException, FCException {

    FCClient fc = new FCClient("192.168.1.30", 2057);
    fc.setShowConsoleLog(true);
    fc.initialize();
    fc.connect();
    fc.login("anonymous", "me@email.com");

    // Let's auto detect the transfer mode.  Unless RTT is high enough, FTP gets used.
    fc.setMode(TransferMode.AUTO);

    // lets send at a constant 1500 Kbps, no congestion control.
    // the congestion control only comes into play if FC gets detected as the best transfer mode
    fc.setUseCongestionControl(false);
    fc.setTargetRate(1500);

    // verify the file afterwards
    fc.setVerifyIntegrity(true);
    upload = fc.upload(new File("c:/bigfiles/500MB"));
    upload.addObserver(this);

    try {
      synchronized (this) {
        wait();
      }
    }
    catch (InterruptedException ex) {
    }

    // disconnect from the server
    fc.disconnect();

    // clean up
    fc.finish();
  }

  public void update(Observable observable, Object object) {

    if (!upload.isTransferComplete() && !upload.isTransferCancelled() &&
        !upload.isTransferError()) {
      if (upload.getStatusCode() == upload.TRANSFERRING &&
          upload.getCurrentPercent() != 100) {
        printProgress(upload.getRate(), upload.getCurrentPercent());
      }
      else if (upload.getStatusCode() == upload.DONEFILE) {
        printProgress(upload.getRate(), 100);
      }
    }
    else {
      // all files complete
      synchronized (this) {
        notifyAll();
      }
    }
  }

  public void printProgress(int rate, int percent) {
    System.out.println(percent + "%");
    System.out.println(rate + " kbps");
  }

  public static void main(String args[]) throws Exception {
    new UploadSampleAdvanced().go();
  }
}

サーバーAPI

サーバーのJavaおよびREST APIはFileCatalystサーバー上のユーザーと要求セッション情報を管理するために必要なすべてのメソッドを公開します。

// Example below is sample code in which the application tries to create a user and
 // wraps up logic for reconnection attempts should the communication between the ServerAPI
 // and the Server be severed.

 // Call to setup initial connection to FileCatalyst Server
 public void init() throws Exception {
   FCServer fcserver = new FCServer();
   // connection parameters
   fcserver.setHostname("localhost");
   fcserver.setPort(12400);
   fcserver.setUserName("admin");
   fcserver.setPassword("system");
   // connect
   fcserver.connect();
 }

 // attempts a reconnection
 private void reconnect () throws Exception {
   try {
     fcserver.disconnect();
   } catch (Exception e) {
   }
   fcserver.connect();
 }

 //
 // Method to modify login credentials for a user.  If the user does not yet exist, create the
 // user as well.
 // @param fcUserName FTP Login name
 // @param fcPassword Password the user wants to have
 // @throws Exception If you cannot connect to the server after 3 attempts, or the server is not allowing you to
 //                   create/modify the user.
 //
 public void createOrModifyUserCredentials(String fcUserName, String fcPassword) throws Exception {
   // Get the FileCatalyst user.
   int MAXATTEMPTS = 3;
   UserContainer fcUser = null;
   int retryAttempts = 0;
   while (fcUser == null && retryAttempts < MAXATTEMPTS ) {
     // try to connect if we've lost the connection
     if (!fcserver.isConnected()) {
       reconnect();
     }
     try {
       fcUser = fcserver.getUser(fcUserName);
       if (fcUser == null) {
         // null return indicates user does not exist -- create
         fcserver.addUser(fcUserName, fcPassword);
         // test to see if the user is really there
         fcserver.resynchConfigurationFiles();
         fcUser = fcserver.getUser(fcUserName);
         if (fcUser == null) {
           throw new Exception("FileCatalyst user could not be created with user name '" + fcUserName + "'");
         }
         return;
       } else {
         fcserver.modUserPassword(fcUserName, fcPassword);
         return;
       }
     } catch (AdminConnectionException e) {
       // conection foobared.  Let's try again
       retryAttempts++;
     }
   }
   throw new Exception("Cannot connect to FCServer, reached max attempts");
}

モバイルのAPI

簡単にアップルのiOSとGoogleのAndroidのための高速ファイル転送アプリを作成します。 FileCatalystは、iOSとAndroidのDalvik用のJava APIのネイティブのObjective-C APIを提供します。

モバイルAPIを使用して構築された、私たちのFileCatalystアプリが利用可能になりました アンドロイド そして iOSの.

//
//  FCAViewController.m
//  example
//
//  Copyright (c) 2012 Unlimi-Tech Software Inc.. All rights reserved.
//
//  This sample code will upload and then download a file named
//  "nature-q-c-320-320-7.jpg" (bundled with the SDK)

#import "FCAViewController.h"
#import "NSString+FCAUtils.h"

@interface FCAViewController ()

@property (strong, nonatomic) FCAControl *control;

@end

@implementation FCAViewController
@synthesize connectionStatusLabel;
@synthesize connectionDetailLabel;
@synthesize transferStatusLabel;
@synthesize transferDetailLabel;
@synthesize cancelButton;
@synthesize downloadButton;
@synthesize uploadButton;
@synthesize connectButton;
@synthesize control;


- (void)reportError:(NSError*)error {
    if (!error) return;

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                    message:error.localizedDescription
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
}

// Basic file upload. The control instance has its own private work queue that all commands (except cancelTransfer) must
// be executed on. To do this, there are two helper methods, performBlock:completion: and performBlockAndWait:
// If any command inside the block fails, it will be reported in the NSError instance passed to the completion block,
// or returned from the performBlockAndWait: call.

- (IBAction)uploadAction:(id)sender {
    [self.uploadButton setTitle:@"Uploading..." forState:UIControlStateNormal];
    self.uploadButton.enabled = NO;

    [self.control performBlock:^{
        NSString *filename = @"nature-q-c-320-320-7.jpg";
        NSURL *fileURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"nature-q-c-320-320-7" ofType:@"jpg"]];

        [control uploadFile:fileURL toPath:filename transferStarted:^(FCAFileTransferStats *stats) {
            // this callback is invoked on the main queue
            self.transferStatusLabel.text = filename;
            self.cancelButton.hidden = NO;
            NSLog(@"transfer has started");
        } transferCompleted:^(FCAFileTransferStats *stats) {
            // this callback is invoked on the main queue
            NSLog(@"transfer has completed");
            self.transferStatusLabel.text = [NSString stringWithFormat:@"%@ finished", filename];
            self.cancelButton.hidden = YES;
        }];

    } completion:^(NSError *error) {
        [self reportError:error];
        [self.uploadButton setTitle:@"Test Upload" forState:UIControlStateNormal];
        self.uploadButton.enabled = YES;
    }];
}

- (IBAction)downloadAction:(UIButton *)sender {
    [self.downloadButton setTitle:@"Downloading..." forState:UIControlStateNormal];
    self.downloadButton.enabled = NO;

    [self.control performBlock:^{
        NSString *filename = @"nature-q-c-320-320-7.jpg";
        NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
                                                                            inDomains:NSUserDomainMask] lastObject];
        NSURL *fileURL = [documentsDirectory URLByAppendingPathComponent:filename];

        [control downloadFile:filename
                        toURL:fileURL
              transferStarted:^(FCAFileTransferStats *stats) {
                  self.transferStatusLabel.text = filename;
                  self.cancelButton.hidden = NO;

              } transferCompleted:^(FCAFileTransferStats *stats) {
                  self.transferStatusLabel.text = [NSString stringWithFormat:@"%@ finished", filename];
                  self.cancelButton.hidden = YES;
              }];
    } completion:^(NSError *error) {
        [self reportError:error];
        [self.downloadButton setTitle:@"Test Download" forState:UIControlStateNormal];
        self.downloadButton.enabled = YES;
    }];
}

// This method shows how to use the nonblocking connect/disconnect calls
- (IBAction)connectAction:(UIButton *)sender {
    if ([self.control isConnected]) {
        sender.enabled = NO;
        [sender setTitle:@"Disconnecting..." forState:UIControlStateNormal];

        [self.control performBlock:^{
            [self.control disconnect];
        } completion:^(NSError *error) {
            sender.enabled = YES;
            [self reportError:error];
        }];
    } else {
        sender.enabled = NO;
        [sender setTitle:@"Connecting..." forState:UIControlStateNormal];

        [self.control performBlock:^{
            [self.control connect];
        } completion:^(NSError *error) {
            sender.enabled = YES;
            [self reportError:error];
        }];
    }
}

- (IBAction)cancelAction:(UIButton *)sender {
    [self.control cancelTransfer];
}


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // create an FCAControl instance and set the connection options
        self.control = [[FCAControl alloc] init];
        self.control.username = @"user";
        self.control.password = @"test";
        self.control.hostname = @"10.0.1.2";
        self.control.port = 8123;

        // some options that are not required to set
        control.useSSL = NO;
        control.autoResumeEnabled = NO;
        control.fileExistsOverride = YES;
    }
    return self;
}

- (void)configureControlStats {
    self.connectionDetailLabel.text = [NSString stringOfTransferRate:self.control.bitsPerSecondAverageTransferRate];
}

- (void)configureView {
    NSString *connectionStatus = nil;

    if ([self.control isConnected]) {
        [self.connectButton setTitle:@"Disconnect" forState:UIControlStateNormal];
        self.uploadButton.hidden = NO;
        self.downloadButton.hidden = NO;
        connectionStatus = @"connected";
    } else {
        [self.connectButton setTitle:@"Connect" forState:UIControlStateNormal];
        self.uploadButton.hidden = YES;
        self.downloadButton.hidden = YES;
        connectionStatus = @"not connected";
    }

    self.connectionStatusLabel.text = [NSString stringWithFormat:@"%@:%d (%@)",
                                       self.control.hostname, self.control.port, connectionStatus];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // there are notifications for the connect and disconnect events
    [[NSNotificationCenter defaultCenter] addObserverForName:FCAControlConnectedKey
                                                      object:self.control
                                                       queue:[NSOperationQueue mainQueue]
                                                  usingBlock:^(NSNotification *note) {
                                                      [self configureView];
                                                  }];

    [[NSNotificationCenter defaultCenter] addObserverForName:FCAControlDisconnectedKey
                                                      object:self.control
                                                       queue:[NSOperationQueue mainQueue]
                                                  usingBlock:^(NSNotification *note) {
                                                      [self configureView];
                                                  }];

    // during transfers, the Control instance will periodically send out a notification with updated
    // connection statistics
    [[NSNotificationCenter defaultCenter] addObserverForName:FCAControlUpdatedKey
                                                      object:self.control
                                                       queue:[NSOperationQueue mainQueue]
                                                  usingBlock:^(NSNotification *note) {
                                                      [self configureControlStats];
                                                  }];


    [self configureView];
}

- (void)viewDidUnload
{
    [self setConnectionStatusLabel:nil];
    [self setConnectionDetailLabel:nil];
    [self setTransferStatusLabel:nil];
    [self setTransferDetailLabel:nil];
    [self setCancelButton:nil];
    [self setDownloadButton:nil];
    [self setUploadButton:nil];
    [self setConnectButton:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } else {
        return YES;
    }
}

@end
Dalvikコードは、以下を参照してください クライアントAPI サンプル。 [/ペイン] [/アコーディオン]

ホットフォルダREST API

ホットフォルダREST APIは、タスクを実行/、新しい監視フォルダを追加、新しいサイトを追加し、作成/操作するメソッドを公開します。

TransferAgent JavaScriptとREST API

TransferAgent JavaScriptとREST APIは、任意のWebアプリケーションとの緊密な統合を可能にします。 これは、Webアプリケーションは、ローカル・ファイル・システムをブラウズ/アクセスキューにファイルを追加し、開始し、進行中のファイル転送を監視することができます。 このすべてはJavaScriptをしかし、もしくは直接REST呼び出しを介して行うことができます。

中央REST API

FileCatalyst中央APIは、すべての接続されたノードのためのすべてのレポートデータへのアクセスを提供し、またサーバー、ホットフォルダとTransferAgent(V3.7に来る)のような個々の接続されたノード、残りのAPIにアクセスするためのリバースHTTPプロキシとして動作します。

ワークフローのREST API

FileCatalystワークフローのためのRESTfulなAPIは、Webを介して管理機能の数を公開します。 これらを含めます:
  • ユーザを追加/編集/削除
  • 追加/編集/削除グループ
  • 注文フォームを追加/編集/削除
  • /編集/削除FTPサイトを追加します。
  • リストジョブフィールド

.NETラッパー

.NETラッパーは、.NETでFileCatalystコマンドラインに透明でスレッドセーフなアクセスを提供しています。 一つの潜在的なアプリケーションは、Microsoftの開発フレームワーク内で開発するFileCatalyst技術を使用することです。 .NETラッパーは、公式のJavaランタイムとFileCatalyst CLIが必要です。 サンプルスクリーンショットを表示します

コマンドラインインタフェース

CLIを使用して、実質的に任意のスクリプト言語を介して、または他の多くのプログラミング言語からFileCatalyst機能にアクセス。 コマンドラインに出力することができる任意のツールをFileCatalystファイル転送をトリガするために使用することができます。

C ++のネイティブクライアントライブラリ

FileCatalyst products are built using Java as the main programming language. This has always allowed us to keep a centralized code base and be compatible across multiple platforms and browsers (via Java Applet Plugin). 95% of systems (desktop/laptop/servers) found on the market today, including Windows, MacOSX, Linux, Solaris, and AIX, can utilize our existing software.

しかし、Javaが利用できない特定のシステムがあります。 多くのセットトップボックス、組み込みシステム(ネットワーク機器、ゲーム機)で、Javaがインストールされたり利用できていません。 このエコシステムは、当社のソリューションを利用することができませんでした。

この観点では、C ++クライアントソリューションを開発しました。 ネイティブC ++ APIまたはネイティブコマンドライン実行の両方として利用可能(Windows用、Linux用の32ビットまたは64ビットのバイナリを.EXE)、私たちのFileCatalyst C ++クライアントは、Javaがインストールされていないシステム上のファイル転送の高速化が可能になります。

 

C ++ウェビナー

#include <FileCatalyst.hpp>

void example( const std::string &serverIpOrHostname, 
              const std::string &username, 
              const std::string &password )
{
    // Set a few options needed by fc::Control so it knows how to behave.
    fc::Options options;
    options.setFtpServer( serverIpOrHostname, 21 );
    options.setUsernameAndPassword( username, password );
    options.setMd5Verification( true );
    options.setMode( fc::kUdp );
    // Create the FTP fc::Control object.  Once it is created, the
    // fc::Options object is no longer required and can go out-of-scope.
    fc::Control ftp( options );
    // Connect to the server with the options originally provided by
    // fc::Options.  If connect() is not explicitly called, then the
    // connection is deferred until a method is called which needs to
    // communicate directly with the server.
    ftp.connect();
    // Note that even after a connection has been established, many (but
    // not all) FTP settings can still be modified.
    fc::Options newOptions = ftp.getOptions();
    newOptions.setBandwidth( fc::k100_Mbps );
    ftp.setNewOptions( newOptions );
    // Download some files from the server.
    ftp.prepareRecursiveDir( fc::Remote("/project"), fc::Local("/tmp") );
    ftp.download();
    ...
}
我々は現在、次のプラットフォームにライブラリを移植しています:
    • Windows 32ビット
    • Windowsの64ビット版
  • Linuxの64ビット(の.deb)
  • Linuxの64ビット(.rpmの)
  • LinuxのARM 7 32ビット(の.deb)
  • LinuxのARM 7 32ビット(.rpmの)
  • OSXの64ビット

あなたが特定のプラットフォームへの移植が必要な場合は、詳細はお問い合わせください。

要求トライアル