Files
xstore/inc/Hura8/System/CDNFileUpload.php

153 lines
4.5 KiB
PHP
Raw Permalink Normal View History

2025-10-04 11:46:59 +07:00
<?php
/**
* Created by Hurasoft.
* Date: 28-May-2022
* Description: Use this class to send local files to the cdn host (endpoint: cdn.host/file_upload_handle.php). The cdn host also has a copy of Hura8 main class to receive the uploaded files
*/
namespace Hura8\System;
class CDNFileUpload {
//protected $upload_handle = 'http://local.hura8/file_upload_handle.php';
protected $upload_handle = STATIC_DOMAIN . '/file_upload_handle.php';
protected $user_id = 0;
protected $target_path_item_type_mapping = [
'product' => 'media/product', // media/product
'article' => 'media/news', // media/news
'brand' => 'media/brand',
'category' => 'media/category',
'banner' => 'media/banner',
'lib' => 'media/lib/',
'user_upload' => 'media/user_upload',
];
public function __construct($user_id) {
$this->user_id = $user_id;
}
/**
* @description: an implementation of start method to upload an item's image
* @param $item_type string
* @param $content string
* @param $file_name string
* @return array | boolean
*/
public function uploadFile($item_type, $file_name, $content, $set_target_path = '')
{
//$file_name = substr(strrchr($img_url, "/"), 1);
//$content = get_url_content($img_url);
$header_setting = [
// 'Authorization' => "Basic ". base64_encode(API_KEY),
];
if($set_target_path) {
$target_path = $set_target_path;
}else{
$target_path = (isset($this->target_path_item_type_mapping[$item_type])) ? $this->target_path_item_type_mapping[$item_type] : '';
}
$multipart_settings = [
[
'name' => 'upload_method',
'contents' => 'content',
],
[
'name' => 'file_name',
'contents' => $file_name,
],
[
'name' => 'target_path',
'contents' => $target_path,
],
[
'name' => 'file_content',
'contents' => $content,
],
//for upload server
[
'name' => 'uid',
'contents' => $this->user_id,
],
[
'name' => 'time',
'contents' => CURRENT_TIME,
],
[
'name' => 'token',
'contents' => $this->createToken($this->user_id, CURRENT_TIME),
],
[
'name' => 'item_type',
'contents' => $item_type ,
],
];
return $this->start($header_setting, $multipart_settings);
}
/*
let settings = {
element : '',//element id to click on
holder : '', //id file holder
form_name : '',
item_type : '',
item_id : '',
file_type : '', //what is the file type: doc, photo, video ?
file_field : '', //what field in the item table this file is used for ?
resize : '200,400,600' //sizes to resize
square: '200,400', //sizes to be square
keep_width : '400', //sizes to keep the width
max_file: 1
}
*/
/**
* @description: a general method for upload
* @param array $header_setting
* @param array $multipart_settings
* @return array | boolean
* @throws \GuzzleHttp\Exception\GuzzleException
*/
protected function start(array $header_setting = [], array $multipart_settings = []) {
$client = new \GuzzleHttp\Client();
$request = $client->request('POST', $this->upload_handle, [
'headers' => $header_setting,
'multipart' => $multipart_settings
]);
return $request->getBody()->getContents();
}
// return string | boolean
protected function getAssetType($file_name) {
$ext = strtolower(strrchr($file_name, "."));
if( $ext == '.css') return 'css';
if( $ext == '.js') return 'js';
if( \in_array($ext, ['.jpg', '.jpeg', '.gif', '.png', '.ico'])) return 'image';
return false;
}
// this salt and createToken must be the same ones as in Hura8/Base/CDNFileUploadHandle
// and different per project (or else others will use it to upload forbidden files on our clients' hosting)
const SECURITY_SALT = 'ahss@3asdaaSDFSD';
protected function createToken($id, $time) {
return sha1(join("-", [$id , $time , static::SECURITY_SALT]));
}
}