FileCatalyst cung cấp nhiều tùy chọn để tích hợp vào các ứng dụng bên thứ 3 và quy trình công việc. SDK của chúng tôi tự hào có đầy đủ các thành phần cho một loạt các ngôn ngữ và môi trường phát triển.

Yêu cầu thử nghiệm

component Công nghệ FileCatalyst sản phẩm
API khách hàng Java, C ++ *, iOS *, Android *, NET * Trực tiếp, Quy trình làm việc
Java Applet, JavaScript API Bất kỳ trình duyệt web gần đây với Java Plug-in Thẳng thắn
Quản lý từ xa Java, REST Trực tiếp, Quy trình làm việc
CLI / Shell Scripting Dòng lệnh* Trực tiếp, Quy trình làm việc
C ++ API / CLI Non-Java Command Line & API Thẳng thắn
* Chuyển đến và đi từ Quy trình làm việc và chỉ Webmail khu vực File.

Bộ công cụ phát triển là nền tảng của sản phẩm của chúng; nếu bạn sở hữu bất kỳ sản phẩm đủ điều kiện, các Development Kit có thể được cấp phép như là một add-on. Đối với phát triển độc lập, SDK thường thêm vào FileCatalyst trực tiếp; Tuy nhiên, một số thành phần được thiết kế để tương tác với FileCatalyst Workflow.

Xem SDK Webinar

tải kèm mã nguồn ví dụ ở đây

API khách hàng

API cũng như các tài liệu của chúng tôi cho phép truy cập đến tất cả các phương pháp cần thiết để thiết lập kết nối tới một máy chủ FileCatalyst cho chuyển file nhanh. Với một vài dòng mã ngắn, bạn có thể tiến hành. giá trị mặc định được sử dụng cho hầu hết các chức năng, với đầy đủ các phương pháp các cuộc gọi cho phép bạn truy cập vào các tính năng tiên tiến.

Các ứng dụng khách API cũng cho phép bạn lập trình trình công việc và các tập tin để FileCatalyst Workflow hoặc Webmail.

nhập unlimited.fc.client.api. *; import java.io. *; public class UploadSample {public static void main (String args []) throws Exception {FCClient fc = FCClient mới ( "192.168.1.30", 21); fc.setShowConsoleLog (true); fc.initialize (); fc.connect (); fc.login ( "vô danh", "me@email.com"); fc.setMode (TransferMode.UDP); // Thiết lập tốc độ bắt đầu và nhắm mục tiêu tỷ lệ giống nhau. Nó sẽ làm chậm nếu ùn tắc gặp phải. fc.setStartRate (10000); fc.setTargetRate (10000); fc.setVerifyIntegrity (true); TransferHook upload = fc.upload (new File ( "c: /temp/500MB.zip")); while (! upload.isTransferComplete ()) {// bạn có thể hiển thị một số thông tin tiến bộ ở đây bằng cách sử dụng phương pháp khác nhau trong // đối tượng TransferHook if (upload.getStatusCode () == upload.TRANSFERRING) {System.out.println (upload .getPercent () + "% "+ upload.getRate () +" Kbps"); } Try {Thread.sleep (1000); } Catch (InterruptedException ex) {}} // ngắt kết nối từ các máy chủ fc.disconnect (); // dọn dẹp 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();
  }
}

Server API

Các Java Server và REST API tiếp xúc với tất cả các phương pháp cần thiết để quản lý người dùng và phiên yêu cầu thông tin về FileCatalyst Server.

// 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 Mobile

Dễ dàng tạo các ứng dụng truyền tải file nhanh chóng cho Apple iOS và Google Android. FileCatalyst cung cấp một API Objective-C có nguồn gốc dành cho iOS và Java API for Android Dalvik.

Được xây dựng bằng cách sử dụng API thoại di động, ứng dụng FileCatalyst của chúng tôi bây giờ đã có cho AndroidiOS.

//
//  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
Đối với mã Dalvik, vui lòng xem API khách hàng sample.

HotFolder REST API

Các HotFolder REST API cho thấy phương pháp để thêm các thư mục đồng hồ mới, thêm trang web mới, và tạo / thao tác / thực thi nhiệm vụ.

TransferAgent JavaScript và REST API

JavaScript TransferAgent và API REST của cho phép tích hợp chặt chẽ với bất kỳ ứng dụng web. Nó cho phép các ứng dụng web truy cập / duyệt hệ thống tập tin địa phương, thêm tệp vào một hàng đợi, bắt đầu và theo dõi chuyển file liên tục. Tất cả điều này có thể được thực hiện thông qua JavaScript, hoặc trực tiếp qua cuộc gọi REST.

Trung REST API

API FileCatalyst Trung ương cung cấp quyền truy cập vào tất cả dữ liệu báo cáo cho tất cả các nút kết nối, và cũng có thể đóng vai trò như một proxy HTTP ngược để truy cập API REST các nút được nối cá nhân, như Server, HotFolder và TransferAgent (sắp tới trong v3.7).

Quy trình làm việc REST API

Một API RESTful cho FileCatalyst Workflow cho thấy một số chức năng quản lý thông qua web. Bao gồm các:
  • Thêm / Sửa / Xóa người dùng
  • Thêm / Sửa / Xóa các nhóm
  • Thêm / Sửa / Xóa hình thức tự
  • Thêm / Sửa / Xóa FTP Sites
  • Danh sách Gióp Fields

NET Wrapper

NET wrapper cung cấp truy cập trong suốt và thread-an toàn cho dòng lệnh FileCatalyst trong .NET. Một ứng dụng tiềm năng là sử dụng công nghệ FileCatalyst để phát triển trong khuôn khổ phát triển của Microsoft. NET wrapper đòi hỏi một thời gian chạy Java chính thức và FileCatalyst CLI. bấm vào để xem mẫu ảnh chụp màn hình

Giao diện dòng lệnh

Sử dụng CLI, truy cập chức năng FileCatalyst qua hầu như bất kỳ ngôn ngữ kịch bản, hoặc từ nhiều ngôn ngữ lập trình khác. Bất kỳ công cụ có khả năng sản lượng vào dòng lệnh có thể được sử dụng để kích hoạt chuyển file FileCatalyst.

Thư viện Native Client 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.

Tuy nhiên, có một số các hệ thống mà Java không có sẵn. Trong nhiều bộ hộp giải mã và các hệ thống nhúng (thiết bị mạng, chơi game console), Java không được cài đặt hoặc có sẵn. Hệ sinh thái này đã không thể tận dụng lợi thế của các giải pháp của chúng tôi.

Trong bối cảnh này, chúng tôi đã phát triển một giải pháp C ++ client. Có sẵn như là cả một C ++ API mẹ đẻ hoặc như một người gốc dòng lệnh thực thi (.exe dành cho Windows, 32 hoặc 64-bit nhị phân cho Linux), ++ client FileCatalyst C của chúng tôi sẽ cho phép tăng tốc chuyển tập tin trên hệ thống mà không có cài đặt Java.

 

C ++ Webinar

#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();
    ...
}
hiện tại chúng tôi đã chuyển các thư viện để các nền tảng sau:
    • Windows 32-bit
    • Windows 64-bit
  • Linux 64-bit (.deb)
  • Linux 64-bit (.rpm)
  • Linux ARM 7 32-bit (.deb)
  • Linux ARM 7 32-bit (.rpm)
  • OSX 64-bit

Nếu bạn cần một cổng vào một nền tảng cụ thể, liên hệ với các chi tiết.

Yêu cầu thử nghiệm