FileCatalyst предоставляет множество возможностей для интеграции в 3-приложений и рабочих процессов сторонних производителей. Наш SDK имеет полный набор компонентов для различных языков программирования и сред.

Запрос Trial

Компонент Технология FileCatalyst продукта
Клиент API Java, C ++ *, * ОС IOS, Android *, .NET * Прямой, Workflow
Java-апплеты, JavaScript API Любой недавний веб-браузер с Java Plug-In непосредственный
Удаленное администрирование Java, REST Прямой, Workflow
CLI / Shell Scripting Командная строка* Прямой, Workflow
C ++ API / CLI Non-Java командной строки и API непосредственный
* Переход к и от рабочего процесса и только Webmail файловых зон.

Комплект разработчика является основой нашей продукции; если у вас есть какие-либо уточняющие продукции, комплект разработки может быть лицензирован в качестве дополнения. Для автономного развития, SDK обычно добавляют к FileCatalyst Direct; Тем не менее, некоторые компоненты предназначены для взаимодействия с FileCatalyst Workflow.

Часы SDK Вебинар

Скачать сопровождающий Пример исходного кода здесь

Клиент API

Наш хорошо документированный API предоставляет доступ к каждому методу, необходимых для установления соединения с сервером FileCatalyst для ускоренной передачи файлов. С помощью нескольких коротких строк кода, вы можете быть в стадии реализации. Значения по умолчанию используются для большинства функций, с полным набором вызовов метода позволяет вам доступ к дополнительным функциям.

Клиент API также позволяет программно отправлять задания и файлы FileCatalyst Workflow или веб-интерфейс.

импортировать unlimited.fc.client.api *. импорт java.io. *; Открытый класс UploadSample {государственной статической силы основных (String агдз []) бросает исключение {FCClient к = новый 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 () + "кбит"); } {Попробуйте Thread.sleep (1000); } Задвижка (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 Server и REST API, разоблачить каждый метод, необходимый для управления пользователями и запроса сеанса информацию о 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");
}

Мобильные интерфейсы

Легко создавать быстрые приложения передачи файлов для Apple, и Google прошивкой Android. FileCatalyst обеспечивает встроенную Objective-C API для прошивкой и API Java для Android Dalvik.

Построенный с использованием мобильного API, наш FileCatalyst приложение теперь доступно для Android а также 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 sample.

HotFolder REST API

HotFolder REST API предоставляет методы для добавления новых папок смотреть, добавлять новые сайты, а также создавать / манипулировать / выполнения задач.

TransferAgent JavaScript и REST API

TransferAgent JavaScript и REST API-интерфейсы позволяют тесной интеграции с любым веб-приложением. Это позволяет веб-приложениям доступ / просматривать локальные файловые системы, добавлять файлы в очередь, инициировать и контролировать текущую передачу файлов. Все это может быть сделано, хотя JavaScript, или непосредственно через REST вызовы.

Центральная REST API

FileCatalyst Central API обеспечивает доступ ко всем данным для отчетности всех подключенных узлов, а также выступает в качестве обратного прокси-сервера HTTP для доступа к REST API для отдельных связанных узлов, таких как сервера, HotFolder и TransferAgent (приход в v3.7).

Workflow REST API

Успокоительной API для FileCatalyst Workflow предоставляет ряд функций управления через Интернет. К ним относятся:
  • Добавить / Редактировать / Удалить пользователей
  • Добавить / Редактировать / Удалить группы
  • Добавить / Редактировать / Удалить формы заказа
  • Добавить / Редактировать / удалить FTP-узлов
  • Список полей Работа

.NET обертка

.NET Обертка предлагает прозрачную и поточно-доступ к FileCatalyst командной строки в .NET. Одним из возможных применений является использование технологии FileCatalyst для разработки в рамках разработки Microsoft. .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. Доступен как и родной API C ++ или как родной командной строки исполняемого файла (.exe для Windows, 32 или 64-битного двоичного файла для Linux), наш клиент 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-разрядный

Если вам требуется порт для конкретной платформы, свяжитесь с нами с деталями.

Запрос Trial