This is a PHP package for accessing Seafile Web API.
No marketing skills whatsoever, but low rates, nearly 20 years of experience, and german work attitude.
Get in touch now: https://sdo.sh/DevOps/#contact
- Open Source Cloud Storage for your teams and organizations
- Built in File Encryption, better Protecting your Privacy
- Collaboration around Files, file locking and other features make collaboration easy.
To get started with Seafile PHP SDK, you may either set up your own private Seafile server (see https://www.seafile.com/en/product/private_server/) or obtain seacloud.cc account https://seacloud.cc. Because the SDK is in its infancy it's highly recommended to set up a test server or create a test account.
It's not advisable yet to use your real server/account if you already got one.
After you have created your test account continue to the next step.
Please note that this SDK currently is under active development and that things might change rather drastically.
If you are looking for stability please refer to stable tags.
The next stable version is planned for January 2018.
Have a look at script bin/obtain_api_token.sh
and use it if you feel comfortable with it. Basically, the script does this:
mkdir ~/.seafile-php-sdk
curl -d "[email protected]&password=123456" https://your.seafile-server.com/api2/auth-token/ > ~/.seafile-php-sdk/api-token.json
Insert your test user name and test user password. Hint: if user name contains a "+" char, replace the char with "%2B" (hex ascii for "+") or urlencode()
the user name altogether. Just so you know.
The file ~/.seafile-php-sdk/api-token.json
will look something like this:
{"token": "your_api_token"}
The example script will assume a config file ~/.seafile-php-sdk/cfg.json
that looks like this:
Have a look at script bin/create_test_cfg.sh
and use it if you feel comfortable with it. Basically, the script does this:
{
"baseUri": "https://your-seafile-server.example.com",
"testLibId": "test-library-id",
"testLibPassword": "test-library-password"
}
The recommended way to install seafile-php-sdk is through Composer.
# Install Composer
curl -sS https://getcomposer.org/installer | php
Next, run the Composer command to install the latest stable version of seafile-php-sdk:
composer.phar require rsd/seafile-php-sdk
# composer.phar dump-autoload -o # not required anymore
After installing, you need to require Composer's autoloader:
require 'vendor/autoload.php';
You can then later update seafile-php-sdk using composer:
composer.phar update
# composer.phar dump-autoload -o # not required anymore
Hint: Have a look at bin/example.php
-- everything this SDK can do is covered there!
First, you need to include the API token (see above):
$tokenFile = getenv("HOME") . "/.seafile-php-sdk/api-token.json";
$token = json_decode(file_get_contents($tokenFile));
$client = new Client(
[
'base_uri' => 'https://your.seafile-server.com',
'debug' => false,
'headers' => [
'Authorization' => 'Token ' . $token->token
]
]
);
$libraryResource = new Library($client);
$libs = $libraryResource->getAll();
foreach ($libs as $lib) {
printf("Name: %s, ID: %s, is encrypted: %s\n", $lib->name, $lib->id, $lib->encrypted ? 'YES' : 'NO');
}
$directoryResource = new Directory($client);
$lib = $libraryResource->getById('some library ID of yours');
$items = $directoryResource->getAll($lib);
foreach ($items as $item) {
printf("%s: %s (%d bytes)\n", $item->type, $item->name, $item->size);
}
$parentDir = '/'; // DirectoryItem must exist within this directory
$directory = 'DirectoryName';
if($directoryResource->exists($lib, $directoryItemName, $parentDir) === false) {
// directory item does not exist
}
Be aware that because Seafile Web API does not provide a function to do this check on its own, all items of the directory will get loaded for iteration. So that's not very efficient.
$parentDir = '/'; // Create directory within this folder
$directory = 'DirectoryName'; // name of the new Directory
$recursive = false; // recursive will create parentDir if not already existing
$success = $directoryResource->create($lib, $directory, $parentDir, $recursive);
$dir = '/'; // dir in the library
$saveTo = '/tmp/'. $item->name; // save file to this local path
$fileResource = new File($client);
$downloadResponse = $fileResource->downloadFromDir($lib, $item, $saveTo, $dir);
Trying to download a file from an encrypted library without unlocking it first would inevitably fail, so just unlock (API docs say "decrypt") the library before attempting:
$success = $libraryResource->decrypt($libId, ['query' => ['password' => $password]]);
// rest is the same as 'Download file from unencrypted library', see above
$fileToUpload = '/path/to/file/to/be/uploaded.zip';
$dir = '/'; // directory in the library to save the file in
$response = $fileResource->upload($lib, $fileToUpload, $dir);
$uploadedFileId = json_decode((string)$response->getBody());
$response = $fileResource->update($lib, $newFilename, '/');
$updatedFileId = json_decode((string)$response->getBody());
$directoryItem = $fileResource->getFileDetail($lib, '/' . basename($fullFilePath));
$accountResource = new Account($client);
$accountType = $accountResource->getInfo();
print_r($accountType->toArray());
$accountResource = new Account($client);
$accountTypes = $accountResource->getAll();
foreach ($accountTypes as $accountType) {
print_r($accountType->toArray());
}
$newAccountType = (new AccountType)->fromArray([
'email' => '[email protected]',
'password' => 'password',
'name' => 'Hugh Jazz',
'note' => 'I will not waste chalk',
'institution' => 'Duff Beer Inc.'
]);
$success = $accountResource->create($newAccountType);
$updateAccountType = (new AccountType)->fromArray([
'name' => 'Divine Hugh Jazz',
'email' => '[email protected]'
]);
$success = $accountResource->update($updateAccountType);
$accountResource = new Account($client);
$accountType = $accountResource->getByEmail('[email protected]');
print_r($accountType->toArray());
$accountResource = new Account($client);
$accountType = (new AccountType)->fromArray([
'email' => '[email protected]'
]);
$success = $accountResource->remove($accountType);
or
$accountResource = new Account($client);
$success = $accountResource->removeByEmail('[email protected]');
$accountType = (new AccountType)->fromArray([
'email' => '[email protected]'
]);
$avatarResource = new Avatar($client);
print_r($avatarResource->getUserAvatar($accountType)->toArray());
or
print_r($avatarResource->getUserAvatarByEmail('[email protected]')->toArray());
$libraryResource = new Library($client);
$directoryResource = new Directory($client);
$fileResource = new File($client);
$sharedLinkResource = new SharedLink($client);
// create share link for a file
$expire = 5;
$shareType = SharedLinkType::SHARE_TYPE_DOWNLOAD;
$p = "/" . basename($newFilename);
$password = 'qwertz123';
$shareLinkType = $sharedLinkResource->create($lib, $p, $expire, $shareType, $password);
// remove shared link
$success = $sharedLinkResource->remove($shareLinkType);
$libraryResource = new Library($client);
$starredFileResource = new StarredFile($client);
// get all starred files
$dirItems = $starredFileResource->getAll();
// unstar all starred files
foreach ($dirItems as $dirItem) {
$lib = $libraryResource->getById($dirItem->repo);
$starredFileResource->unstar($lib, $dirItem);
}
// re-star all files
foreach ($dirItems as $dirItem) {
$lib = $libraryResource->getById($dirItem->repo);
$starredFileResource->star($lib, $dirItem);
}
This example requires monolog. Log entries and Guzzle debug info will be written to stdout.
$logger = new Logger('Logger');
$stack = HandlerStack::create();
$stack->push(
Middleware::log(
$logger,
new MessageFormatter("{hostname} {req_header_Authorization} - {req_header_User-Agent} - [{date_common_log}] \"{method} {host}{target} HTTP/{version}\" {code} {res_header_Content-Length} req_body: {req_body} response_body: {res_body}")
)
);
$client = new Client(
[
'base_uri' => 'https://your.seafile-server.com',
'debug' => true,
'handler' => $stack,
'headers' => [
'Authorization' => 'Token ' . $token->token
]
]
);
- Please let me know of issues.
- PHP >=5.6.29 64 bits (if you require a backport to an older PHP version contact me for a quote!)
- PHP >=7.0 64 bits
- Guzzle 6
Resource | Support grade |
---|---|
Account | π΅π΅π΅βͺ |
Starred Files | π΅π΅π΅π΅ |
Group | π΅βͺβͺβͺ |
File Share Link | π΅π΅βͺβͺ |
Library/Library | π΅π΅βͺβͺ |
Library/File | π΅π΅βͺβͺ |
Library/Directory | π΅π΅βͺβͺ |
Library/Multiple Files | π΅π΅π΅π΅ |
Avatar | π΅π΅π΅π΅ |
Events | not planned |
Organization | not planned |
Tested with:
Seafile Server 5.1.3 for generic Linux/Debian JessieSeafile Server 5.1.3 for generic Linux/Debian WheezySeafile Server 5.1.4 for generic Linux/Ubuntu XenialSeafile Server 6.0.3 for generic Linux/Ubuntu Xenial- Seafile Server 6.0.7 for generic Linux/Ubuntu Xenial
- If you require a backport for an older Seafile server version contact me for a quote!
Please note that this package still is in its infancy. Only a small part of the API has been implemented so far.
Pull requests are welcome. Please adhere to some very basic and simple principles:
- Follow "separation of concern" on all levels: 1 issue == 1 pull request. Do not cover multiple issues in a pull request.
- Unit tests raise the chance of your pull request getting accepted.
- The same goes for PHPDoc blocks.
- https://seafile.com
- https://www.seafile-server.org/ (Seafile server hosting in Germany)
- http://manual.seafile.com/develop/web_api.html#seafile-web-api-v2
- https://sdo.sh
MIT Β© 2015-2017 Rene Schmidt DevOps UG (haftungsbeschrΓ€nkt) & Co. KG