Comments (9)
Кажется, это другая проблема. У Яндекс.Диска в последнее время какие-то проблемы с загрузкой файлов с определенными расширениями. На данный момент на Диск через REST API (в браузере всё в порядке) файлы грузятся до боли медленно (у меня вообще терпения не хватает, чтобы дождаться до конца). Проблему можно обойти только если указывать другое расширение файла, как бы глупо это не звучало.
По неизвестным причинам не грузятся: *.db, *.zip и *.mp4 файлы (скорее всего и некоторые другие).
Эта проблема самого Яндекс.Диска, она не связана с этой библиотекой, такой же результат можно получить и через CURL.
Совсем недавно у другого человека была такая же проблема, но только с async-версией: yadisk-async issue #3
from yadisk.
В документации теперь про эту проблему есть отдельный пункт. Там описано что это такое и что с этим делать.
from yadisk.
Если вы под Windows, это может быть баг стандартной библиотеки (urllib3 issue #1394, Python Issue33838), из-за которого скорость загрузки в некоторых случаях значительно ниже под Windows.
Вы можете попробовать залить файл при помощи yadisk-async (API почти такой же) и сравнить скорость загрузки, там этой проблемы нет, т.к. aiohttp не использует http.client.
from yadisk.
Проблему можно обойти, пропатчив http.client
и urllib3
:
def patch_http_client_blocksize():
"""Increases default blocksize for http.client.HTTPConnection"""
import http.client
original_init = http.client.HTTPConnection.__init__
def init_patched(self, *args, **kwargs):
kwargs.setdefault("blocksize", 2 * 1024**2)
original_init(self, *args, **kwargs)
http.client.HTTPConnection.__init__ = init_patched
def patch_urllib3_blocksize():
"""Increases default blocksize for urllib3's HTTPConnection"""
import urllib3
original_init = urllib3.connection.HTTPConnection.__init__
def init_patched(self, *args, **kwargs):
kwargs.setdefault("blocksize", 2 * 1024**2)
original_init(self, *args, **kwargs)
urllib3.connection.HTTPConnection.__init__ = init_patched
# Should be done before imports of these modules
patch_http_client_blocksize()
patch_urllib3_blocksize()
Приведенный кусок кода нужно выполнить до импорта yadisk
и requests
. Более детальное описание, почему это работает, я привел в том issue urllib3.
from yadisk.
Спасибо!!
А если использовать api яндекса и requests способ тот же?
def patch_http_client_blocksize():
"""Increases default blocksize for http.client.HTTPConnection"""
import http.client
original_init = http.client.HTTPConnection.__init__
def init_patched(self, *args, **kwargs):
kwargs.setdefault("blocksize", 2 * 1024**2)
original_init(self, *args, **kwargs)
http.client.HTTPConnection.__init__ = init_patched
def patch_urllib3_blocksize():
"""Increases default blocksize for urllib3's HTTPConnection"""
import urllib3
original_init = urllib3.connection.HTTPConnection.__init__
def init_patched(self, *args, **kwargs):
kwargs.setdefault("blocksize", 2 * 1024**2)
original_init(self, *args, **kwargs)
urllib3.connection.HTTPConnection.__init__ = init_patched
# Should be done before imports of these modules
patch_http_client_blocksize()
patch_urllib3_blocksize()
import requests
from datetime import datetime
URL = 'https://cloud-api.yandex.net/v1/disk/resources'
TOKEN = ''
headers = {'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': f'OAuth {TOKEN}'}
path_p = '123'
path_f = r'C:/Users/fire-/Desktop/1/11.mp4'
def upload_file(loadfile, savefile, replace=False):
"""Загрузка файла.
savefile: Путь к файлу на Диске
loadfile: Путь к загружаемому файлу
replace: true or false Замена файла на Диске"""
start = datetime.now()
res_url = requests.get(f'{URL}/upload?path={savefile}&overwrite={replace}', headers=headers).json()
with open(loadfile, 'rb') as f:
try:
res_load_file = requests.put(res_url['href'], files={'file': f})
if res_load_file.status_code == 201:
print(f'Загрузка файла {f.name} завершена, затрачено времени: {datetime.now() - start}')
except KeyError:
print(f'{res_url=}')
if __name__ == '__main__':
name = path_f.split('/')[-1]
upload_file(path_f, f'/{name}')
Такое не работает (
from yadisk.
Что именно не работает? Я попробовал запустить ваш код, у меня все нормально загрузилось, с нормальной скоростью. Единственное, что GET параметры подставлять напрямую в URL - плохая идея, лучше передавать их через params
.
from yadisk.
Загрузка файла с патчем, затрачено времени: 0:02:23.403436 - попытка 1
Загрузка файла без патча, затрачено времени: 0:02:01.080888
Загрузка файла c патчем, затрачено времени: 0:02:09.742823 - попытка 2
Из браузера загрузка фала 15.2 мб практически мгновенно
from yadisk.
На данный момент проблема со скоростью загрузки файлов НА яндекс диск актуальна. Не знаю с какими конкретно расширениями, но видео .avi
размером 500МБ у меня грузилось 48 минут 👎 👎 👎
Убрал расширение из названия и все ок, загрузилось как в браузере за 30 сек
пи.си. автору респект
from yadisk.
Я нашёл ссылку, где человек эксперимент с разными расширениями провёл
https://python.su/forum/topic/40819/
from yadisk.
Related Issues (20)
- Немного некорректная работа функции yadisk.YaDisk.check_token() для ограниченных прав HOT 3
- Ошибка в документации HOT 2
- Падает при загрузке на диск больших файлов HOT 7
- Не загружаются файлы с ':' в названии HOT 3
- Yadisk.Upload() gives error when parametrs are provided by names HOT 2
- Can't download specific file from public link HOT 2
- TypeError: 'type' object is not subscriptable HOT 1
- HTTPSConnectionPool(host='cloud-api.yandex.net', port=443) on Android HOT 2
- Проблема с загрузкой zip архив 175Mb. HOT 5
- YaDisk.Upload() not actaully apply argument "overwrite" HOT 1
- Ошибка Доступ запрещён. Возможно, у приложения недостаточно прав для данного действия. (Forbidden / ForbiddenError) HOT 1
- Не могу создать публичную ссылку на папку. HOT 1
- Downloading photos/videos from unlimited storage | Скачивание фото\видео из безлимитного хранилища HOT 4
- Как получить результат метода save_to_disk если результат SyncOperationLinkObject / How to get the result of the save_to_disk method if the result is SyncOperationLinkObject HOT 2
- [Bug] grant_type not in POST при отправке кода подтверждения HOT 1
- [Feature Request] link lifetime HOT 2
- [Question] yadisk.exceptions.UnauthorizedError: Не авторизован. (Unauthorized / UnauthorizedError) HOT 3
- [Bug] requests is not installed. После компиляции кода HOT 2
- [Bug] Проблема при сборке .exe файла HOT 2
- [Question] Не работает listdir HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from yadisk.