OSError: несоответствие размера на месте! 4628344! = 330596 - PullRequest
0 голосов
/ 12 апреля 2020

Я пытался отправить файл с использованием SFTP python библиотеки pysftp на удаленный сервер почтовых ящиков. Но когда я пытаюсь положить файл, я получаю эту ошибку:

Я использую python 3.7.4

Traceback (most recent call last):
 File "SFTP.py", line 54, in <module>
   srv.put('file.zip','file.zip')
 File "C:\Users\HP\Anaconda3\lib\site-packages\pysftp\__init__.py", line 364, in put
   confirm=confirm)
 File "C:\Users\HP\Anaconda3\lib\site-packages\paramiko\sftp_client.py", line 759, in put
   return self.putfo(fl, remotepath, file_size, callback, confirm)
 File "C:\Users\HP\Anaconda3\lib\site-packages\paramiko\sftp_client.py", line 723, in putfo
   "size mismatch in put!  {} != {}".format(s.st_size, size)
OSError: size mismatch in put!  4628344 != 330596

PS: я пытался с другим удаленным сервером, и он отлично работает , Это мой код

import pysftp
import os
cnopts = pysftp.CnOpts()
hostkeys = None
host="host.com"
username=username
password=password

if cnopts.hostkeys.lookup(host) == None:
    print("New host - will accept any host key")
    # Backup loaded .ssh/known_hosts file
    hostkeys = cnopts.hostkeys
    # And do not verify host key of the new host
    cnopts.hostkeys = None

with pysftp.Connection(host=host, username=username, password=password, cnopts=cnopts) as sftp:        
    if hostkeys != None:
        print("Connected to new host, caching its hostkey")
        hostkeys.add(host, sftp.remote_server_key.get_name(), sftp.remote_server_key)
        hostkeys.save(pysftp.helpers.known_hosts())


srv = pysftp.Connection(host=host, username=username,password=password)
srv.put('file.zip','file.zip')

1 Ответ

0 голосов
/ 28 апреля 2020

Я нашел обходное решение, но не рекомендовал, я смог go решить проблему, просто прокомментировав блок c кода, где возникает исключение:

 with self.file(remotepath, "wb") as fr:
            fr.set_pipelined(True)
            size = self._transfer_with_callback(
                reader=fl, writer=fr, file_size=file_size, callback=callback
            )
        if confirm:
            s = self.stat(remotepath)
            if s.st_size != size:
                s = SFTPAttributes()
                pass
                # raise IOError(
                #     "size mismatch in put!  {} != {}".format(s.st_size, size)
                # )
        else:
            s = SFTPAttributes()
        return s

файл site-packages\paramiko\sftp_client.py. но решение вызывает другие проблемы с размером файла. файл, переданный на сервер, накапливается всякий раз, когда я запускаю метод put (), поэтому вам нужно быть осторожным с этим.

EDIT:

сработало после установки сообщения -check параметр соответствует False. Поэтому нет необходимости изменять paramiko код.

srv.put('file.zip','file.zip',confirm=False)
...