Files
OMS/app/taskmgr/lib/storage/sftp.php
2025-12-28 23:13:25 +08:00

162 lines
4.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright © ShopeX http://www.shopex.cn. All rights reserved.
* See LICENSE file for license details.
*/
/**
* 数据文件生成ftp类
*
* @author kamisama.xia@gmail.com
* @version 0.1
*/
class taskmgr_storage_sftp extends taskmgr_storage_abstract implements taskmgr_storage_interface
{
private static $_storageConn = null;
private static $_sftp = null;
/**
* __construct
* @return mixed 返回值
*/
public function __construct()
{
$this->connect();
}
/**
* connect
* @return mixed 返回值
*/
public function connect()
{
if (!isset(self::$_storageConn)) {
if (isset($GLOBALS['__STORAGE_CONFIG'])) {
$config = $GLOBALS['__STORAGE_CONFIG'];
self::$_storageConn = ssh2_connect($config['HOST'], $config['PORT']);
if (!self::$_storageConn) {
trigger_error('connect sftp failed, please check it', E_USER_ERROR);
}
$login_result = ssh2_auth_password(self::$_storageConn, $config['USER'], $config['PASSWD']);
if (!$login_result) {
trigger_error('login sftp failed, please check it', E_USER_ERROR);
}
self::$_sftp = @ssh2_sftp(self::$_storageConn);
if (! self::$_sftp) {
trigger_error("Could not initialize SFTP subsystem.", E_USER_ERROR);
}
// if ($config['PASV'] == true) {
// ftp_pasv(self::$_storageConn, true);
// }
return true;
} else {
trigger_error('can\'t load __STORAGE_CONFIG, please check it', E_USER_ERROR);
}
}
}
/**
* 向远程ftp上传保存生成文件
*
* @param string $source_file 源文件含路径
* @param string $task_id 目标文件名命名传入参数
* @param string $url 生成目标文件路径
* @return boolean true/false
*/
public function save($source_file, $task_id, &$url)
{
//存储的目的地文件路径
$destination_file = $this->_get_ident($task_id);
//传输上传文件
$sftp = self::$_sftp;
$stream = @fopen("ssh2.sftp://$sftp$destination_file", 'w');
if (! $stream) {
return false;
}
$data_to_send = @file_get_contents($source_file);
if (@fwrite($stream, $data_to_send) === false) {
return false;
}
@fclose($stream);
//上传结果
$url = $destination_file;
return true;
}
/**
* 向远程ftp下载文件到本地
*
* @param string $url 远程源文件
* @param string $local_file 本地目标文件
* @return boolean true/false
*/
public function get($url, $local_file)
{
$sftp = self::$_sftp;
$stream = @fopen("ssh2.sftp://$sftp$url", 'r');
if (! $stream) {
return false;
}
$contents = stream_get_contents($stream);
if (@file_put_contents($local_file, $contents) === false) {
return false;
}
@fclose($stream);
//上传结果
return true;
}
/**
* 向远程ftp删除指定文件
*
* @param string $url 远程源文件
*/
public function delete($url)
{
$sftp = self::$_sftp;
return ssh2_sftp_unlink($sftp, $url);
}
//含完整路径的生成文件地址
public function _get_ident($key)
{
$config = $GLOBALS['__STORAGE_CONFIG'];
$folder = rtrim($config['rootPath'] ?: '/', '/') . '/' . date('Ymd');
$sftp = self::$_sftp;
ssh2_sftp_mkdir($sftp, $folder,0777, true);
$path = $this->_ident($key);
$url = $folder . '/' . $path;
return $url;
}
public function __destruct()
{
ssh2_disconnect(self::$_storageConn);
ssh2_disconnect(self::$_sftp);
}
}