实现复制粘贴功能

This commit is contained in:
Chenx221 2024-02-16 13:37:15 +08:00
parent 1551514abf
commit b09d2e6c36
Signed by: chenx221
GPG Key ID: D7A9EC07024C3021
2 changed files with 215 additions and 9 deletions

View File

@ -43,6 +43,7 @@ class HomeController extends Controller
'multi-ff-zip-dl' => ['POST'], 'multi-ff-zip-dl' => ['POST'],
'zip' => ['POST'], 'zip' => ['POST'],
'unzip' => ['POST'], 'unzip' => ['POST'],
'paste' => ['POST'],
], ],
], ],
] ]
@ -483,6 +484,10 @@ class HomeController extends Controller
return Yii::$app->response->sendFile($zipPath); return Yii::$app->response->sendFile($zipPath);
} }
/**
* @return Response
* @throws NotFoundHttpException
*/
public function actionZip() public function actionZip()
{ {
$model = new ZipForm(); $model = new ZipForm();
@ -561,4 +566,177 @@ class HomeController extends Controller
]; ];
} }
} }
/**
*
*
* @return Response
*/
public function actionPaste()
{
// 获取请求中的操作类型、相对路径和目标目录
$operation = Yii::$app->request->post('operation');
$relativePaths = Yii::$app->request->post('relativePaths');
$targetDirectory = Yii::$app->request->post('targetDirectory');
// 对相对路径进行解码
$relativePaths = array_map('rawurldecode', $relativePaths);
// 对每个相对路径进行处理
foreach ($relativePaths as $relativePath) {
// 确定源文件/目录和目标文件/目录的绝对路径
$sourcePath = Yii::getAlias(Yii::$app->params['dataDirectory']) . '/' . Yii::$app->user->id . '/' . $relativePath;
$targetPath = Yii::getAlias(Yii::$app->params['dataDirectory']) . '/' . Yii::$app->user->id . '/' . $targetDirectory . '/' . basename($relativePath);
// 检查目标路径是否是源路径的子路径 // 你是白痴吗
if ($operation === 'cut' && is_dir($sourcePath) && str_starts_with($targetPath, $sourcePath)) {
Yii::$app->session->setFlash('error', 'Cannot move a directory into itself.');
return $this->redirect(['index', 'directory' => $targetDirectory]);
}
// 检查目标路径是否已经存在同名文件或目录
if ($operation === 'copy' && file_exists($targetPath)) {
$pathInfo = pathinfo($targetPath);
$i = 1;
do {
$newFilename = $pathInfo['filename'] . '_副本' . ($i > 1 ? $i : '');
$newTargetPath = $pathInfo['dirname'] . '/' . $newFilename . '.' . $pathInfo['extension'];
$i++;
} while (file_exists($newTargetPath));
$targetPath = $newTargetPath;
}
// 根据操作类型执行相应的操作
if ($operation === 'copy') {
// 如果是复制操作
if (is_dir($sourcePath)) {
// 如果源路径是目录,递归复制目录
if (!$this->copyDirectory($sourcePath, $targetPath)) {
Yii::$app->session->setFlash('error', 'Failed to copy directory.');
return $this->redirect(['index', 'directory' => $targetDirectory]);
}
} else {
// 如果源路径是文件使用PHP的copy函数复制文件
if (!copy($sourcePath, $targetPath)) {
Yii::$app->session->setFlash('error', 'Failed to copy file.');
return $this->redirect(['index', 'directory' => $targetDirectory]);
}
}
} elseif ($operation === 'cut') {
// 如果是剪切操作
if (is_dir($sourcePath)) {
// 如果源路径是目录,递归移动目录
if (!$this->moveDirectory($sourcePath, $targetPath)) {
Yii::$app->session->setFlash('error', 'Failed to move directory.');
return $this->redirect(['index', 'directory' => $targetDirectory]);
}
} else {
// 如果源路径是文件使用PHP的rename函数移动文件
if (!rename($sourcePath, $targetPath)) {
Yii::$app->session->setFlash('error', 'Failed to move file.');
return $this->redirect(['index', 'directory' => $targetDirectory]);
}
}
}
}
Yii::$app->session->setFlash('success', 'Operation completed successfully.');
return $this->redirect(['index', 'directory' => $targetDirectory]);
}
/**
* 递归复制目录及其内容
* @param string $source 源目录路径
* @param string $destination 目标目录路径
* @return bool 操作是否成功
*/
protected function copyDirectory($source, $destination)
{
// 创建目标目录
if (!mkdir($destination)) {
return false;
}
// 打开源目录
$dir = opendir($source);
if ($dir === false) {
return false;
}
// 递归复制目录的内容
while (($entry = readdir($dir)) !== false) {
if ($entry === '.' || $entry === '..') {
continue;
}
$sourcePath = $source . '/' . $entry;
$destinationPath = $destination . '/' . $entry;
if (is_dir($sourcePath)) {
// 如果源路径是目录,递归复制目录
if (!$this->copyDirectory($sourcePath, $destinationPath)) {
return false;
}
} else {
// 如果源路径是文件,复制文件
if (!copy($sourcePath, $destinationPath)) {
return false;
}
}
}
closedir($dir);
return true;
}
/**
* 递归移动目录及其内容
* @param string $source 源目录路径
* @param string $destination 目标目录路径
* @return bool 操作是否成功
*/
protected function moveDirectory($source, $destination)
{
// 创建目标目录
if (!mkdir($destination)) {
return false;
}
// 打开源目录
$dir = opendir($source);
if ($dir === false) {
return false;
}
// 递归移动目录的内容
while (($entry = readdir($dir)) !== false) {
if ($entry === '.' || $entry === '..') {
continue;
}
$sourcePath = $source . '/' . $entry;
$destinationPath = $destination . '/' . $entry;
if (is_dir($sourcePath)) {
// 如果源路径是目录,递归移动目录
if (!$this->moveDirectory($sourcePath, $destinationPath)) {
return false;
}
} else {
// 如果源路径是文件,移动文件
if (!rename($sourcePath, $destinationPath)) {
return false;
}
}
}
closedir($dir);
// 删除源目录
if (!rmdir($source)) {
return false;
}
return true;
}
} }

View File

@ -123,20 +123,48 @@ $(document).on('click', '.single-rename-btn', function () {
var relativePath = $('.select-item:checked').first().data('relativePath'); var relativePath = $('.select-item:checked').first().data('relativePath');
$('.rename-btn[value="' + relativePath + '"]').trigger('click'); $('.rename-btn[value="' + relativePath + '"]').trigger('click');
}); });
// 当用户点击复制按钮时
$(document).on('click', '.batch-copy-btn', function () { $(document).on('click', '.batch-copy-btn', function () {
console.log('复制按钮被点击'); var relativePaths = $('.select-item:checked').map(function () {
// 在这里添加你的代码 return $(this).data('relativePath');
}).get();
sessionStorage.setItem('operation', 'copy');
sessionStorage.setItem('relativePaths', JSON.stringify(relativePaths));
updateButtons(); // 更新按钮的状态
}); });
// 当用户点击剪切按钮时
$(document).on('click', '.batch-cut-btn', function () { $(document).on('click', '.batch-cut-btn', function () {
console.log('剪切按钮被点击'); var relativePaths = $('.select-item:checked').map(function () {
// 在这里添加你的代码 return $(this).data('relativePath');
}).get();
sessionStorage.setItem('operation', 'cut');
sessionStorage.setItem('relativePaths', JSON.stringify(relativePaths));
updateButtons(); // 更新按钮的状态
}); });
// 当用户点击粘贴按钮时
$(document).on('click', '.batch-paste-btn', function () { $(document).on('click', '.batch-paste-btn', function () {
console.log('粘贴按钮被点击'); var operation = sessionStorage.getItem('operation');
// 在这里添加你的代码 var relativePaths = JSON.parse(sessionStorage.getItem('relativePaths'));
var targetDirectory = $('#target-dir').val();
$.ajax({
type: "POST",
url: "index.php?r=home%2Fpaste",
data: { operation: operation, relativePaths: relativePaths, targetDirectory: targetDirectory },
success: function(response) {
// 处理响应
location.reload();
},
error: function() {
// 处理错误
console.error('AJAX request failed.');
}
});
sessionStorage.removeItem('operation'); // 清除 sessionStorage 中的 operation
sessionStorage.removeItem('relativePaths'); // 清除 sessionStorage 中的 relativePaths
hasCopiedOrCut = false; // 设置 hasCopiedOrCut 为 false
updateButtons(); // 更新按钮的状态
}); });
$(document).on('click', '.calc-sum-btn', function () { $(document).on('click', '.calc-sum-btn', function () {
@ -302,7 +330,7 @@ function updateButtons() {
var count = checkboxes.length; var count = checkboxes.length;
var isSingleFile = count === 1 && !checkboxes.first().data('isDirectory'); var isSingleFile = count === 1 && !checkboxes.first().data('isDirectory');
var isSingleZip = isSingleFile && checkboxes.first().closest('tr').find('.file_icon').hasClass('fa-file-zipper'); var isSingleZip = isSingleFile && checkboxes.first().closest('tr').find('.file_icon').hasClass('fa-file-zipper');
var hasCopiedOrCut = false/* 判断是否有复制或剪切的项,你需要自己实现这部分逻辑 */; var hasOperation = sessionStorage.getItem('operation') !== null; // 检查 sessionStorage 中是否存在 operation
$('.single-download-btn').toggle(isSingleFile); $('.single-download-btn').toggle(isSingleFile);
$('.batch-zip-download-btn').toggle(count > 0 && !isSingleFile); $('.batch-zip-download-btn').toggle(count > 0 && !isSingleFile);
@ -311,7 +339,7 @@ function updateButtons() {
$('.single-rename-btn').toggle(count === 1); $('.single-rename-btn').toggle(count === 1);
$('.batch-copy-btn').toggle(count >= 1); $('.batch-copy-btn').toggle(count >= 1);
$('.batch-cut-btn').toggle(count >= 1); $('.batch-cut-btn').toggle(count >= 1);
$('.batch-paste-btn').toggle(hasCopiedOrCut); $('.batch-paste-btn').toggle(hasOperation); // 根据 hasOperation 的值来决定是否显示粘贴按钮
$('.calc-sum-btn').toggle(isSingleFile); $('.calc-sum-btn').toggle(isSingleFile);
$('.single-share-btn').toggle(count === 1); $('.single-share-btn').toggle(count === 1);
$('.batch-delete-btn').toggle(count >= 1); $('.batch-delete-btn').toggle(count >= 1);