好吧,我想通过 Laravel 将图像上传到 Cloudinary, 我按照文档中所述的步骤进行操作:
https://github.com/cloudinary-labs/cloudinary-laravel 在这里:https://cloudinary.com/blog/laravel_file_upload_to_a_local_server_or_to_the_cloud
我正在使用 Laravel 8,这是我的代码:
public function store(Request $request){
$request->validate([
'name' => 'required|string|unique:festivals|max:255', //unique:table
'description' => 'required|string|max:255',
'image' => 'required|image|dimensions:min_width=200,min_height=200',
], self::$messages);
//Here I create an instance and upload file to server
$festival = new Festival($request->all());
$path = cloudinary()->upload($request->file('image')->getRealPath())->getSecurePath();
dd($path);
//Then at field image of festivals que save the path and that goes to the database
$festival->image = 'festivals/' . basename($path);
$festival->save();
return response() -> json($festival, 201); //code 201 created
}
当我尝试通过 Postman 创建新记录时,会发生这种情况:
但是,图像已上传到Cloudinary:
然后我尝试检查记录是否创建,但没有创建。
我能做什么,有人知道吗?
谢谢
好的,我解决了:)
//Here I create an instance and upload file to server
$festival = new Festival($request->all());
$result = $request->image->storeOnCloudinary();
//Here I get the url
$path = $result->getPath();
//Then at field image of festivals que save the path and that goes to the database
//$festival->image = $path; output: "https://res.cloudinary.com/test/image/upload/v1226931211/zuiyb17vfs8dre6gvuov.jpg"
//$festival->image = dirname($path); output: "https://res.cloudinary.com/test/image/upload/v1526711711"
//$festival->image = basename($path); output: "zuiy31lvfs4dre5gvuov.jpg"
$base = basename(dirname($path).basename($path)); //output: "v1636941221zuiyb14vfsmdre6gvuov.jpg"
$folder = substr($base, 0, -24); //output: "v1626915261"
//So:
$img_path = $folder.'/'.basename($path);
$festival->image = 'festivals/'.$img_path; //imageFolder/imageName.jpg;
但是如果有人有最好的方法,请告诉我
这就是我在 Laravel 10 中的做法
我创建了一个可重用的客户端CloudinaryImageClient.php
<?php
namespace App\Integrations\files;
use Cloudinary\Api\Upload\UploadApi;
use Cloudinary\Configuration\Configuration;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Log;
class CloudinaryImageClient
{
protected $cloudinaryInstance;
public function __construct()
{
$this->cloudinaryInstance = Configuration::instance([
'cloud' => [
'cloud_name' => Config::get('cloudinary.cloud_name'),
'api_key' => Config::get('cloudinary.api_key'),
'api_secret' => Config::get('cloudinary.api_secret')
],
'url' => [
'secure' => true
]]);
}
public function uploadImage(string $mimeType, string $base64FileContents): CloudinaryResults
{
$formattedUploadUri = self::createUri($mimeType, $base64FileContents);
try {
$uploadClient = new UploadApi();
$results = $uploadClient->upload($formattedUploadUri, ['resource_type' => 'image']);
Log::info("cloudinary upload results: " . json_encode($results));
return CloudinaryResults::success($results['secure_url'], $results['url']);
} catch (\Exception $e) {
Log::error("Failed to upload file to cloudflare $e");
return CloudinaryResults::failed($e->getMessage());
}
}
/**
* Utility function
*
* @param string $mimeType -- example image/jpeg
* @param string $base64FileContents
* @return string uploadUri in format 'data:image/jpeg;base64, LzlqLzRBQ... {Base64 image data}'
*/
private static function createUri(string $mimeType, string $base64FileContents): string
{
return 'data:' . $mimeType . ';base64,' . $base64FileContents;
}
}
这是我如何在控制器
上使用自定义可重用客户端class CustomerBooksController extends Controller
{
public function __construct()
{
}
public function uploadImage(Request $request): JsonResponse
{
$request->validate([
'image_file' => 'required|file',
]);
$cloudinaryClient = new CloudinaryImageClient();
$mimeType = $request->file('image_file')->getClientMimeType();
$base64Contents = base64_encode($request->file('image_file')->getContent());
$results = $cloudinaryClient->uploadImage($mimeType,$base64Contents);
return response()->json($results);
}
}
Cloudinary 版本 - “cloudinary/cloudinary_php”:“^2.10” Laravel 框架 10.9.0