실제 프로젝트에서는 서버 용량과 대역폭이 제한되어 리소스를 업로드하려면 타사 개체 스토리지 서비스를 사용해야 하는 경우가 많습니다. 중국의 주요 서비스 제공업체로는 Qiniu Cloud, Alibaba 등이 있습니다. 이 기사에서는 Qiniu Cloud를 예로 들어 Qiniu Cloud와 같은 서비스 제공업체의 공간에 사용자의 비디오를 업로드하는 방법을 설명합니다.
Qiniu Cloud 업로드에는 두 가지 주요 유형이 있습니다.
서버 측 업로드
프런트 엔드 업로드이며, 프런트 엔드는 두 가지 반환 방법으로 나뉩니다:
1) Ajax를 해결할 수 있는 리디렉션 반환. 크로스 도메인 문제
2) 콜백이 반환되면 Qiniu Cloud는 먼저 서버에 데이터를 반환한 다음 Qiniu Cloud가 프런트 엔드로 반환되어 미니 프로그램 업로드와 같은 리디렉션을 지원하지 않는 요청 방식을 해결합니다
이번에는 Qiniu Cloud PHP SDK를 사용했습니다.
composer require qiniu/php-sdk
이번에는 kindeditor 편집기를 사용했습니다.
Kindeditor/php 아래에 config.php를 추가하여 주로 매개변수 구성
<?php error_reporting(0); defined('ROOT_PATH') || define('ROOT_PATH', dirname(__DIR__).'/'); defined('QINIU_ACCESS_KEY') || define('QINIU_ACCESS_KEY', ''); defined('QINIU_SECRET_KEY') || define('QINIU_SECRET_KEY', ''); defined('QINIU_TEST_BUCKET') || define('QINIU_TEST_BUCKET', '七牛云空间名'); defined('QINIU_BUCKET_DOMAIN') || define('QINIU_BUCKET_DOMAIN', '七牛云空间网址'); defined('CALLBACK_URL') || define('CALLBACK_URL', '域名/kindeditor/php/callBack.php'); defined('RETURN_URL') || define('RETURN_URL', '域名/kindeditor/php/returnBack.php'); require_once ROOT_PATH."vendor/autoload.php";
Kiniu_token.php를 Kindeditor/php 아래에 추가하여 업로드용 토큰을 생성하세요
<?php use Qiniu\Auth; require_once __DIR__."/config.php"; // 构建鉴权对象 $auth = new Auth(QINIU_ACCESS_KEY, QINIU_SECRET_KEY); $data = [ 'returnUrl' => RETURN_URL, ]; if (isset($_REQUEST['is_call'])) { $data = [ 'callbackUrl' => CALLBACK_URL, 'callbackBody' => 'key=$(key)&hash=$(etag)&w=$(imageInfo.width)&h=$(imageInfo.height)' ]; } // 生成上传 Token $token = $auth->uploadToken(QINIU_TEST_BUCKET, null, 3600, $data); echo json_encode([ 'error' => 0, 'token' => $token ]);
Kindeditor/php 아래에 콜백 추가
<?php use Qiniu\Auth; require_once __DIR__."/config.php"; $_body = file_get_contents('php://input'); $auth = new Auth(QINIU_ACCESS_KEY, QINIU_SECRET_KEY); //回调的contentType $contentType = 'application/x-www-form-urlencoded'; //回调的签名信息,可以验证该回调是否来自七牛 $authorization = $_SERVER['HTTP_AUTHORIZATION']; $isQiniuCallback = $auth->verifyCallback($contentType, $authorization, CALLBACK_URL, $_body); if (!$isQiniuCallback) { echo json_encode([ 'error' => 2, 'message' => '验证失败' ]); die(); } $body = $_POST; $qiniu_url = QINIU_BUCKET_DOMAIN; if (!empty($body['key'])) { echo json_encode([ 'error' => 0, 'url' => $qiniu_url.$body['key'] ]); die(); } echo json_encode([ 'error' => 1, 'message' => '视频上传出错' ]);
Kindeditor/php 밑에 returnBack.php 추가 주로 수신주소 리다이렉트
<?php use Qiniu\Auth; require_once __DIR__."/config.php"; $upload_ret = base64_decode($_GET['upload_ret']); $upload_ret = json_decode($upload_ret, true); $qiniu_url = QINIU_BUCKET_DOMAIN; if (!empty($upload_ret['key'])) { echo json_encode([ 'error' => 0, 'url' => $qiniu_url.$upload_ret['key'] ]); die(); } echo json_encode([ 'error' => 1, 'message' => '视频上传出错' ]);
다음은 프론트엔드 변경인데, 제가 변경한 것은 동영상 업로드입니다
Kindeditor/plugins/ media/media.js
KindEditor.plugin('media', function(K) { var self = this, name = 'media', lang = self.lang(name + '.'), allowMediaUpload = K.undef(self.allowMediaUpload, true), allowFileManager = K.undef(self.allowFileManager, false), formatUploadUrl = K.undef(self.formatUploadUrl, true), extraParams = K.undef(self.extraFileUploadParams, { 'token': ''//添加token }), filePostName = K.undef(self.filePostName, 'file'), //更改文件上传名 uploadJson = K.undef(self.uploadJson, 'https://up.qbox.me'); //更改上传地址,我用的时华东区的空间使用https .... function getQToken() { $.getJSON('/includes/kindeditor/php/qiniu_token.php', function (data) { K('[name="token"]', div).val(data.token); }); } // 获取设置上传token getQToken(); if (allowMediaUpload) { var uploadbutton = K.uploadbutton({ button : K('.ke-upload-button', div)[0], fieldName : filePostName, extraParams : extraParams, url : uploadJson,//去除添加参数 afterUpload : function(data) { ... });
이렇게 하면 Qiniu Cloud에 동영상을 업로드할 수 있습니다.
관련 권장 사항:
WeChat 애플릿을 Qiniu Cloud Storage에 연결하는 방법의 예
Qiniu Cloud를 사용하여 Laravel에서 이미지를 업로드하는 예
위 내용은 PHP 애플리케이션 Qiniu Cloud에 대한 리디렉션 업로드 및 콜백 업로드 공유 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!