Coder Social home page Coder Social logo

Comments (9)

ivknv avatar ivknv commented on June 8, 2024 2

Кажется, это другая проблема. У Яндекс.Диска в последнее время какие-то проблемы с загрузкой файлов с определенными расширениями. На данный момент на Диск через REST API (в браузере всё в порядке) файлы грузятся до боли медленно (у меня вообще терпения не хватает, чтобы дождаться до конца). Проблему можно обойти только если указывать другое расширение файла, как бы глупо это не звучало.

По неизвестным причинам не грузятся: *.db, *.zip и *.mp4 файлы (скорее всего и некоторые другие).
Эта проблема самого Яндекс.Диска, она не связана с этой библиотекой, такой же результат можно получить и через CURL.

Совсем недавно у другого человека была такая же проблема, но только с async-версией: yadisk-async issue #3

from yadisk.

ivknv avatar ivknv commented on June 8, 2024 2

В документации теперь про эту проблему есть отдельный пункт. Там описано что это такое и что с этим делать.

from yadisk.

ivknv avatar ivknv commented on June 8, 2024

Если вы под Windows, это может быть баг стандартной библиотеки (urllib3 issue #1394, Python Issue33838), из-за которого скорость загрузки в некоторых случаях значительно ниже под Windows.
Вы можете попробовать залить файл при помощи yadisk-async (API почти такой же) и сравнить скорость загрузки, там этой проблемы нет, т.к. aiohttp не использует http.client.

from yadisk.

ivknv avatar ivknv commented on June 8, 2024

Проблему можно обойти, пропатчив 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.

Pacifist2503 avatar Pacifist2503 commented on June 8, 2024

Спасибо!!
А если использовать 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.

ivknv avatar ivknv commented on June 8, 2024

Что именно не работает? Я попробовал запустить ваш код, у меня все нормально загрузилось, с нормальной скоростью. Единственное, что GET параметры подставлять напрямую в URL - плохая идея, лучше передавать их через params.

from yadisk.

Pacifist2503 avatar Pacifist2503 commented on June 8, 2024

Загрузка файла с патчем, затрачено времени: 0:02:23.403436 - попытка 1
Загрузка файла без патча, затрачено времени: 0:02:01.080888
Загрузка файла c патчем, затрачено времени: 0:02:09.742823 - попытка 2
Из браузера загрузка фала 15.2 мб практически мгновенно

from yadisk.

555Russich avatar 555Russich commented on June 8, 2024

На данный момент проблема со скоростью загрузки файлов НА яндекс диск актуальна. Не знаю с какими конкретно расширениями, но видео .avi размером 500МБ у меня грузилось 48 минут 👎 👎 👎

Убрал расширение из названия и все ок, загрузилось как в браузере за 30 сек
пи.си. автору респект

from yadisk.

maxifly avatar maxifly commented on June 8, 2024

Я нашёл ссылку, где человек эксперимент с разными расширениями провёл
https://python.su/forum/topic/40819/

from yadisk.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.