Laravel Ошибка получить shared link файла загруженного на dropbox

mstdmstd

Новичок
Всем привет,
В laravel 5.5 приложении нужно загрузить файл на dropbox и получить shared link этого файла.

Я использовал DropboxAdapter либу и эту https://murze.be/dropbox-will-turn-off-v1-of-their-api-soon-its-time-to-update-your-php-application доку
И также читая тут о версии 2 dropbox-а
https://laravel.com/docs/5.5/filesystem#retrieving-files

Мне удалось загузить файл на dropbox, но проблема с получением shared link-а этого файла.
Делая :

PHP:
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Auth;
use Intervention\Image\Facades\Image as Image;
use Carbon\Carbon;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;

use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client;
use Spatie\FlysystemDropbox\DropboxAdapter;


...
class TmpCsvp extends MyAppModel
{

...
public static function setToIsApplied($id,bool $to_copy, $to_employee_id)
{
...
$dropboxClient = new Client(env('DROPBOX_OATH'));
$adapter = new DropboxAdapter($dropboxClient);
$filesystem = new Filesystem($adapter);


echo '<pre>$filesystem::'.print_r($filesystem,true).'</pre>'; // Вывод League\Flysystem\Filesystem Object класса
echo '<pre>$dropboxClient::'.print_r($dropboxClient,true).'</pre>'; // вывод Spatie\Dropbox\Client класса

$uploaded = $filesystem->put($dest_dropbox_file_name, $file, []);
echo '<pre>$uploaded::'.print_r($uploaded,true).'</pre>'; // The output is 1

$exists = Storage::disk('dropbox')->exists($dest_dropbox_file_name);
echo '<pre>$exists::'.print_r($exists,true).'</pre>';

$url = Storage::disk('dropbox')->url($dest_dropbox_file_name); // THAT LINE RAISE EXCEPTION
echo '<pre>$url::'.print_r($url,true).'</pre>';

Но получаю ошибку:

Код:
This driver does not support retrieving URLs.
с выводом https://imgur.com/a/HpE4M

При этом файл благополучно загружен по пути в $dest_dropbox_file_name вроде “docs/-doc-130/lender_image_1.jpg”

Мой composer.json :

Код:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.0.0",
"doctrine/dbal": "^2.5",
"fideloper/proxy": "~3.3",
"intervention/image": "^2.4",
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0",
"maatwebsite/excel": "~2.1.0",
"mcamara/laravel-localization": "^1.3",
"rcrowe/twigbridge": "^0.9.5",
"sebastiansulinski/dotenv": "^2.0",
"sebastiansulinski/php-backup": "^2.0",
"spatie/flysystem-dropbox": "^1.0",
"spatie/laravel-backup": "^3.0.0"
},
"require-dev": {
"filp/whoops": "~2.0",
"fzaninotto/faker": "~1.4",
"mockery/mockery": "~1.0",
"phpunit/phpunit": "~6.0"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"extra": {
"laravel": {
"dont-discover": [
]
}
},
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
}
}
В моем коде/конфигурации ошибка?


Спасибо !
 

Adelf

Administrator
Команда форума
А вообще, я думаю в дропбоксе не так просто взять url. Надо сделать файл публичным сначала. И вообще, бери S3 :)
 

mstdmstd

Новичок
А какие могут быть конструктивные решения?
1) Если выкинуть этот плагин, то что использовать заместо? API должен быть под Dropbox API Verion 2.
2) если переписать этот кусочек кода ? То нужно
2.1) Сделать файл публичным. Этот плагин это позволяет?
2.2) И потом взять его урл переписав этот кусок кода...
2.3) В таком случае после каждого composer update придется проверять свои изменнения в этом плагине? Это, конечно, через одно место, но лучше чем ничего...

Да в задаче как раз и шла речь что берем что-то несложное типа dropbox и не связываемся сгигантом s3...
 

fixxxer

К.О.
Партнер клуба
Конструктивное решение - забыть про Laravel-овские костыли с фасадом Storage и работать напрямую с dropbox-клиентом.

Насколько я понимаю, вся эта тряхомудия - обертка над spatie/dropbox-api, там все нужные тебе методы вроде есть: https://github.com/spatie/dropbox-api/blob/master/tests/ClientTest.php#L564
 

mstdmstd

Новичок
Установив пакет и в config/app.php прописав
Код:
    'providers' => [
       ...
        Spatie\Dropbox\Client::class,
получаю ошибку :
Код:
  Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_RECOVERABLE_ERROR)
Type error: Argument 1 passed to Spatie\Dropbox\Client::__construct() must be of the type string, object given, called in /mnt/_work_sdb8/wwwroot/lar/dropbox_test/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 208
Даже не вызывая моего контрола

Похоже токены должны быть прописаны , но где?
В config/filesystems.php имею :
Код:
    'disks' => [
         ...
        'dropbox' => [
            'driver' => 'dropbox',
            'authorizationToken' => $DROPBOX_OATH,
            'appSecret' => $DROPBOX_SECRET,
        ],
    ],

Я ожидал увидеть файл вида config/dropbox.php но такого файла нет.
Или причина в другом?
 

Adelf

Administrator
Команда форума
Spatie\Dropbox\Client::class это не провайдер. это класс, который надо зарегистрировать в контейнере, как-нибудь как описано здесь - https://laravel.com/docs/5.5/container#binding
и потом юзать где надо.
 

mstdmstd

Новичок
Значит из config/app.php я убрал строку
...
PHP:
Spatie\Dropbox\Client::class,
И в контроле :

PHP:
use Spatie\Dropbox\Client;

class HomeController extends Controller
{
...
$client_api = new Spatie\Dropbox\Client(new client);
$r= $this->app->instance('Spatie\Dropbox\Client', $client_api);
...

И получаю ошибку:
Class 'App\Http\Controllers\Spatie\Dropbox\Client' not found
?
 
Сверху