Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Возможно ли загрузка нескольких файлов сразу или только по 1? #42

Open
motoroller1983 opened this issue Mar 28, 2022 · 4 comments

Comments

@motoroller1983
Copy link

Возможно ли загрузка нескольких файлов сразу или только по 1?

@jack-theripper
Copy link
Owner

В библиотеке есть поддержка промисов и асинхронных методов, остальное зависит от вас - какой код напишите

@motoroller1983
Copy link
Author

Не сосем понятно, есть ли пример?
Выгрузка одного файл занимает крайне долго, а мне надо отправить допустим 10-20К файлов (но они очень небольшие) по 20-30кб. Нет возможность отправлять сразу допустим по 100 файлов?

@jack-theripper
Copy link
Owner

jack-theripper commented Mar 28, 2022

Такие запросы как у вас - это не задача библиотеки, тем не менее тут много чего поддерживается и реализовать вашу задачу не составляет проблем

use Arhitector\Yandex\Disk;
use Laminas\Diactoros\Request;
use Laminas\Diactoros\Stream;

$MyClient = new class extends Disk {

	public function my_upload()
	{
		$files = ['111.jpg', '222.jpg', '333.jpg'];

		return (function () use ($files) {
			foreach ($files as $filePath) {

				$uploadUrl = $this->uri->withPath($this->uri->getPath() . 'resources/upload')
					->withQuery(http_build_query(['path' => $filePath]));

				$request = new Request($uploadUrl, 'GET');
				$response = json_decode($this->send($request)->getBody()); // блокирующий запрос.

				if (isset($response->href)) {
					$stream = new Stream(__DIR__.'/'.$filePath, 'rb');
					$request = new Request($response->href, 'PUT', $stream);

					yield $this->client->sendAsyncRequest($request); // не блокирующий.
				}
			}
		})();
	}

};

$client = new $MyClient('');
$promises = $client->my_upload();

foreach ($promises as $promise) {
	/** @var \Http\Client\Curl\CurlPromise $promise */
	$promise->wait(); // загрузка файла

	echo 'ok'.PHP_EOL;
}

@motoroller1983
Copy link
Author

Благодарю, подскажите, а как сделать асинхронную загрузку?
А то скорость выгрузки на яндекс даже небольшого файла желает оставлять лучшего.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants