FileCatalyst มีตัวเลือกมากเพื่อบูรณาการในการใช้งานของบุคคลที่ 3 และเวิร์กโฟลว์ SDK ของเราภูมิใจนำเสนอเต็มรูปแบบของชิ้นส่วนสำหรับความหลากหลายของภาษาการพัฒนาและสภาพแวดล้อม

คำขอทดลอง

ตัวแทน เทคโนโลยี สินค้า FileCatalyst
API ไคลเอ็นต์ Java, C ++ * * * * * iOS, Android * * * * * .NET ตรงเวิร์กโฟลว์
จาวา, JavaScript API ใด ๆ ที่เว็บเบราเซอร์ที่ผ่านมากับ Java Plug-in โดยตรง
ดูแลระบบระยะไกล ชวา REST ตรงเวิร์กโฟลว์
CLI / เชลล์การเขียนสคริปต์ บรรทัดคำสั่ง* ตรงเวิร์กโฟลว์
c ++ API / CLI Non-Java บรรทัดคำสั่งและ API โดยตรง
* บริการรถรับส่งไปและกลับจากการทำงานและการ Webmail ไฟล์พื้นที่เท่านั้น

ชุดพัฒนาเป็นรากฐานของผลิตภัณฑ์ของเรา; หากคุณเป็นเจ้าของผลิตภัณฑ์ที่มีคุณสมบัติใด ๆ ชุดพัฒนาอาจจะได้รับใบอนุญาตเป็น add-on สำหรับการพัฒนาแบบสแตนด์อโลน SDK จะมีการเพิ่มมักจะไป FileCatalyst โดยตรง; แต่บางส่วนถูกออกแบบมาเพื่อโต้ตอบกับ FileCatalyst เวิร์กโฟลว์

ดู SDK Webinar

ดาวน์โหลดที่มาพร้อมกับ รหัสที่มาตัวอย่างที่นี่

API ไคลเอ็นต์

API ดีเอกสารของเราช่วยให้การเข้าถึงทุกวิธีที่จำเป็นในการสร้างการเชื่อมต่อไปยัง FileCatalyst เซิร์ฟเวอร์สำหรับการถ่ายโอนไฟล์เร่ง ด้วยเส้นสั้น ๆ ไม่กี่ของรหัสที่คุณสามารถเป็นความสัตย์ซื่อ ค่าเริ่มต้นจะใช้สำหรับฟังก์ชั่นมากที่สุดกับช่วงเต็มรูปแบบของวิธีการสายช่วยให้คุณสามารถเข้าถึงคุณลักษณะขั้นสูง

ลูกค้า API ยังช่วยให้คุณโปรแกรมส่งงานและไฟล์ไปยัง FileCatalyst Workflow หรือเมล์

นำเข้า unlimited.fc.client.api *. นำเข้า java.io. *; UploadSample คลาสที่สาธารณะ {ประชาชนเป็นโมฆะคง main (String args []) พ่นข้อยกเว้น {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"); } try {Thread.sleep (1000) } catch (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

ชวา Server และ 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 สำหรับมือถือ

ได้อย่างง่ายดายสร้างปพลิเคชันการถ่ายโอนไฟล์ได้อย่างรวดเร็วสำหรับ Apple iOS และ Google Android FileCatalyst ให้ API Objective-C พื้นเมืองสำหรับ iOS และใน Java API สำหรับ Android Dalvik

สร้างขึ้นโดยใช้ 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 ไคลเอ็นต์ sample.

HotFolder REST API

HotFolder REST API exposes วิธีการที่จะเพิ่มโฟลเดอร์นาฬิกาใหม่เพิ่มเว็บไซต์ใหม่และสร้าง / จัดการ / ดำเนินงาน

TransferAgent JavaScript และ REST API

TransferAgent JavaScript และ API REST อนุญาตให้มีการผนวกกับแอพลิเคชันเว็บใด ๆ จะช่วยให้การใช้งานเว็บเข้าถึง / เรียกดูระบบไฟล์ในท้องถิ่นเพิ่มไฟล์ในคิวเริ่มต้นและการตรวจสอบการถ่ายโอนไฟล์อย่างต่อเนื่อง ทั้งหมดนี้สามารถทำได้แม้ว่า JavaScript หรือโดยตรงผ่านสาย REST

กลาง REST API

FileCatalyst กลาง API ให้การเข้าถึงข้อมูลการรายงานทั้งหมดสำหรับโหนดเชื่อมต่อทั้งหมดและยังทำหน้าที่เป็นพร็อกซี HTTP ย้อนกลับในการเข้าถึง REST API สำหรับเชื่อมต่อของโหนดแต่ละรายเช่นเซิร์ฟเวอร์ HotFolder และ TransferAgent (ที่มาใน v3.7)

เวิร์กโฟลว์ REST API

สงบ API สำหรับเวิร์กโฟลว์ FileCatalyst exposes จำนวนของฟังก์ชั่นการจัดการผ่านเว็บ เหล่านี้รวมถึง:
  • เพิ่ม / แก้ไข / ลบผู้ใช้
  • เพิ่ม / แก้ไข / ลบกลุ่ม
  • เพิ่ม / แก้ไข / ลบรูปแบบการสั่งซื้อสินค้า
  • เพิ่ม / แก้ไข / ลบ FTP ไซต์
  • รายการทุ่งงาน

.NET Wrapper

เสื้อคลุม .NET มีบริการที่โปร่งใสและด้ายปลอดภัยกับ FileCatalyst บรรทัดคำสั่งใน .NET หนึ่งโปรแกรมที่อาจเกิดขึ้นคือการใช้เทคโนโลยี FileCatalyst ในการพัฒนาภายใต้กรอบการพัฒนาไมโครซอฟท์ เสื้อคลุม .NET ต้องใช้รันไทม์ Java อย่างเป็นทางการและ FileCatalyst CLI คลิกเพื่อดูภาพหน้าจอตัวอย่าง

Command Interface สาย

ใช้ฟังก์ชัน 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 หรือเป็นปฏิบัติการพื้นเมืองบรรทัดคำสั่ง (.exe สำหรับ Windows 32 หรือไบนารี 64 บิตสำหรับลินุกซ์) FileCatalyst C ++ ของเราจะช่วยให้ลูกค้าเร่งการถ่ายโอนไฟล์บนระบบที่ไม่ได้มีการติดตั้ง 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();
    ...
}
เราได้รังเพลิงปัจจุบันห้องสมุดเพื่อแพลตฟอร์มต่อไปนี้:
    • ของ Windows 32 บิต
    • Windows 64 บิต
  • ลินุกซ์ 64 บิต (.deb)
  • ลินุกซ์ 64 บิต (.rpm)
  • ลินุกซ์ ARM 7 32 บิต (.deb)
  • ลินุกซ์ ARM 7 32 บิต (.rpm)
  • OSX 64 บิต

หากคุณต้องการพอร์ตไปยังแพลตฟอร์มเฉพาะติดต่อเราที่มีรายละเอียด

คำขอทดลอง