FileCatalyst offre de nombreuses options pour l'intégration dans les applications 3ème partie et les flux de travail. Notre SDK dispose d'une gamme complète de composants pour une variété de langages et environnements de développement.

Demande de première instance

Composant Technologie FileCatalyst produit
Client API Java, C ++ *, iOS *, Android *, .NET * Direct, Workflow
Applets Java, JavaScript API Tout navigateur web récent avec le plug-in Java Direct
administration à distance Java, REST Direct, Workflow
CLI / Shell Scripting Ligne de commande* Direct, Workflow
API C ++ / CLI Java Non Line & API de commande Direct
* Transfert vers et depuis Workflow et les zones de fichiers Webmail seulement.

Le kit de développement est le fondement de nos produits; si vous possédez des produits admissibles, le kit de développement peut être autorisé comme un add-on. Pour le développement autonome, le SDK est généralement ajouté à FileCatalyst direct; Cependant, certains composants sont conçus pour interagir avec FileCatalyst Workflow.

Regarder SDK Webinar

Télécharger accompagnement par exemple le code source ici

Client API

Notre API bien documenté donne accès à toutes les méthodes nécessaires pour établir une connexion à un serveur FileCatalyst pour les transferts de fichiers accélérés. Avec quelques lignes de code, vous pouvez être en cours. Les valeurs par défaut sont utilisées pour la plupart des fonctions, avec une gamme complète de la méthode des appels vous permettant d'accéder à des fonctionnalités avancées.

L'API Client vous permet également de soumettre programmation des emplois et des fichiers à FileCatalyst workflow ou Webmail.

importer unlimited.fc.client.api. *; import java.io. *; public class UploadSample {static void main (args String []) publics throws Exception {FCClient fc = new FCClient ( "192.168.1.30", 21); fc.setShowConsoleLog (true); fc.initialize (); fc.connect (); fc.login ( "anonyme", "me@email.com"); fc.setMode (TransferMode.UDP); // Définit le taux de départ et le taux cible de la même. Il va ralentir si la congestion rencontrée. fc.setStartRate (10000); fc.setTargetRate (10000); fc.setVerifyIntegrity (true); TransferHook upload = fc.upload (new File ( "c: /temp/500MB.zip")); while (! upload.isTransferComplete ()) {// vous pouvez afficher des informations de progression ici en utilisant les différentes méthodes dans // l'objet TransferHook if (upload.getStatusCode () == upload.TRANSFERRING) {System.out.println (upload .getPercent () + "%" + upload.getRate () + "Kbps"); } Try {Thread.sleep (1000); } Catch (InterruptedException ex) {}} // déconnecter du fc.disconnect du serveur (); // Nettoyer 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

Le Java Server et API REST exposent toutes les méthodes nécessaires pour gérer les utilisateurs et demande des informations sur la session de 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 mobiles

Créez facilement des applications rapides de transfert de fichiers pour Apple iOS et Google Android. FileCatalyst fournit une API Objective-C native pour iOS et une API Java pour Android Dalvik.

Construit en utilisant l'API mobile, notre application FileCatalyst est maintenant disponible pour Androïde et 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
Pour le code Dalvik, s'il vous plaît voir le Client APIéchantillon.

HotFolder REST API

Le HotFolder REST API expose des méthodes pour ajouter de nouveaux dossiers de surveillance, ajouter de nouveaux sites, et de créer / manipuler / exécuter des tâches.

TransferAgent JavaScript et REST API

Le TransferAgent JavaScript et API REST permettent une intégration étroite avec toute application web. Il permet aux applications Web d'accéder à / parcourir les systèmes de fichiers locaux, ajouter des fichiers à une file d'attente, de lancer et de surveiller les transferts de fichiers en cours. Tout cela peut être fait si JavaScript, ou directement par le biais des appels REST.

Central REST API

L'API FileCatalyst centrale permet d'accéder à toutes les données de rapports pour tous les noeuds connectés, et agit aussi comme un proxy HTTP inverse pour accéder à la REST API de noeuds connectés individuels, comme serveur, HotFolder et TransferAgent (à venir en v3.7).

Workflow API REST

Une API RESTful pour FileCatalyst workflow expose un certain nombre de fonctions de gestion à travers le web. Ceux-ci inclus:
  • Ajouter / Modifier / Supprimer utilisateur
  • Ajouter / Modifier / Supprimer Groupes
  • Ajouter / Modifier / Supprimer des formulaires de commande
  • Ajouter Sites / Modifier / Supprimer FTP
  • Liste Champs d'emploi

.NET Wrapper

Le wrapper .NET offre un accès transparent et thread-safe à la ligne de commande FileCatalyst dans .NET. Une application potentielle est d'utiliser la technologie FileCatalyst à développer dans le cadre de développement de Microsoft. Le wrapper .NET nécessite une exécution Java officielle et FileCatalyst CLI. cliquez pour voir l'échantillon capture d'écran

Command Line Interface

Utilisation de l'accès fonctionnalité FileCatalyst CLI par pratiquement tout langage de script, ou de nombreux autres langages de programmation. Tout outil capable de sortie à la ligne de commande peut être utilisé pour déclencher des transferts de fichiers FileCatalyst.

Native Client bibliothèque 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.

Toutefois, il existe certains systèmes où Java ne sont pas disponibles. Dans de nombreux décodeurs et systèmes embarqués (appliance réseau, consoles de jeux), Java est pas installé ou disponible. Cet écosystème a été incapable de tirer profit de nos solutions.

À la lumière de cela, nous avons développé une solution de C ++ client. Disponible à la fois comme une API C ++ natif ou comme un exécutable de ligne de commande native (.exe pour Windows, binaire 32 ou 64 bits pour Linux), notre client FileCatalyst C ++ va permettre une accélération de transfert de fichiers sur les systèmes qui ne sont pas présentes sur 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();
    ...
}
Nous avons actuellement porté la bibliothèque pour les plates-formes suivantes:
    • Windows 32 bits
    • Windows 64 bits
  • Linux 64 bits (.deb)
  • Linux 64 bits (.rpm)
  • Linux ARM 7 32-bit (.deb)
  • Linux ARM 7 32-bit (.rpm)
  • OSX 64 bits

Si vous avez besoin d'un port à une plate-forme spécifique, contactez-nous avec les détails.

Demande de première instance