ThinkPHP文件上传接口
文件上传接口
上传在项目/runtime/storage/下,返回的是相对路径.
/**
* 文件上传接口
* param file: /2024-06-11_09-50-43.png
* return
* {
* "status": 1,
* "msg": "上传成功",
* "data": {
* "file_path": "/uploads/20240611/6a2282ada486c614e170dff06063527f.png"
* }
* }
*/
public function uploadAjax()
{
// 获取上传的文件
$file = Request::file('file');// 使用 Facade
// 或$file = request()->file('file'); // 使用全局辅助函数
// 验证规则
$validate = Validate::rule([
'file' => 'fileExt:jpg,jpeg,png,gif|fileSize:10485760', // 限制文件扩展名和大小
]);
// 验证文件
if (!$validate->check(['file' => $file])) {
return json(['status' => 0, 'msg' => $validate->getError()]);
}
// 上传文件
try {
// $_SERVER['DOCUMENT_ROOT']为/www/wwwroot/项目/public目录
// 如果使用服务器其他非项目路径,需要在public/.user.ini文件中添加授权的目录,且将该目录设为www用户,权限为766
// $file->getOriginalName()为文件名称
$file->move($_SERVER['DOCUMENT_ROOT']."/uploads/",$file->getOriginalName());
/**
* 存储在/www/wwwroot/项目名/runtime/storage/下面指定的uploads文件夹中
* $savename = Filesystem::putFile('uploads', $file);
*/
return json(['status' => 1, 'msg' => '上传成功', 'data' => ['file_path' => '/' . $savename]]);
} catch (\Exception $e) {
return json(['status' => 0, 'msg' => $e->getMessage()]);
}
}
FTP服务上传
<?php
namespace app\controller;
use app\Request;
class FtpController
{
protected $ftp_server = '127.0.0.1'; // FTP 服务器地址,如果公网IP,FTP能连接能创建文件但是大小为0切换127发现成功
protected $ftp_port = 21; // FTP 端口号
protected $ftp_user = 'ftpuser'; // FTP 用户名
protected $ftp_pass = 'ftppwd'; // FTP 密码
// FTP 连接
private function connect()
{
$conn_id = ftp_connect($this->ftp_server, $this->ftp_port);
if (!$conn_id) {
return ['error' => '无法连接到 FTP 服务器'];
}
if (!@ftp_login($conn_id, $this->ftp_user, $this->ftp_pass)) {
ftp_close($conn_id);
return ['error' => 'FTP 登录失败'];
}
// 启用被动模式
ftp_pasv($conn_id, true);
return $conn_id;
}
// 上传文件
public function uploadAjax(Request $request)
{
// 连接到 FTP 服务器
$conn_id = $this->connect();
if (isset($conn_id['error'])) return json($conn_id);
// 从文件输入框获取上传的文件
$file = $request->file('file'); // 'file' 是文件输入框的名称
// 检查文件是否上传成功
if (!$file) {
return json(['error' => '没有接收到文件']);
}
// 将文件保存到服务器的临时目录
$local_file = $file->getPathname();
$remote_file = '/' . $file->getOriginalName(); // 目标路径,ftp的根目录下面
// 上传文件到 FTP 服务器
if (@ftp_put($conn_id, $remote_file, $local_file, FTP_BINARY)) {
$result = ['message' => '文件上传成功'];
} else {
// 获取错误信息
$error = error_get_last();
$result = [
'error' => '文件上传失败',
'message' => $error['message'] ?? '未知错误'
];
// $result = ['error' => '文件上传失败'];
}
// 关闭 FTP 连接
ftp_close($conn_id);
return json($result);
}
// 删除文件
public function deleteFileAjax(Request $request)
{
$conn_id = $this->connect();
if (isset($conn_id['error'])) return json($conn_id);
$remote_file = $request->param('remote_file'); // 服务器上的文件路径
if (ftp_delete($conn_id, $remote_file)) {
$result = ['message' => '文件删除成功'];
} else {
$result = ['error' => '文件删除失败'];
}
ftp_close($conn_id);
return json($result);
}
// 重命名文件
public function rename(Request $request)
{
$conn_id = $this->connect();
if (isset($conn_id['error'])) return json($conn_id);
$old_name = $request->param('old_name'); // 原文件名
$new_name = $request->param('new_name'); // 新文件名
if (ftp_rename($conn_id, $old_name, $new_name)) {
$result = ['message' => '文件重命名成功'];
} else {
$result = ['error' => '文件重命名失败'];
}
ftp_close($conn_id);
return json($result);
}
// 列出文件
public function listFilesAjax(Request $request)
{
$conn_id = $this->connect();
if (isset($conn_id['error'])) return json($conn_id);
$directory = $request->param('directory', '.'); // 默认当前目录
$file_list = ftp_nlist($conn_id, $directory);
if ($file_list !== false) {
$result = ['files' => $file_list];
} else {
$result = ['error' => '无法获取文件列表'];
}
ftp_close($conn_id);
return json($result);
}
}
如果这篇文章对你有用,可以关注本人微信公众号获取更多ヽ(^ω^)ノ ~