#python #sockets #cloud #file-transfer
Вопрос:
Итак, я работал над созданием облачного хранилища для своего дома, но проблема в том, что оно получает только .txt или файлы, содержащие только текст. Я хочу, чтобы он получал изображения zip-файлов и все типы файлов, но когда я пытаюсь отправить zip-файл или файл любого другого типа… Я получаю эту ошибку.
Traceback (most recent call last):
File "D:WorkspaceCodeCloud Storageclient.py", line 45, in <module>
file_data = in_file.read()
File "C:UsersShashankhAppDataLocalProgramsPythonPython39libencodingscp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 328: character maps to <undefined>
я действительно получаю файл, но файл либо поврежден, либо пуст.
это мой код.
client.py
import socket
import pyautogui
from tkinter import *
from tkinter import filedialog
import os
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.0.108',4321))
root = Tk()
root.withdraw()
while True:
confirm_send = pyautogui.confirm("Do you want to start file transfer?")
if confirm_send == 'OK':
warning = pyautogui.confirm("WARNING!: IF YOU HAVE ALREADY SENT THE FILE WITH THE SAME NAME... THE DATA MAY OVERWRITE AND MAY GET CORRUPTED. CHANGE YOUR FILENAME FOR SAFETY!")
if warning == 'OK':
prompt = pyautogui.prompt(text='Cloud Name', title='' , default='Enter your cloud storage folder name')
if prompt == 'Shashankh':
s.send(bytes('Shashankh','utf-8'))
if prompt == 'Hari':
s.send(bytes('Hari','utf-8'))
if prompt == 'Eshitha':
s.send(bytes('Eshitha','utf-8'))
if prompt == 'Prasanna':
s.send(bytes('Prasanna','utf-8'))
if prompt == None:
exit()
file = filedialog.askopenfilename()
if file == 'Cancel':
quit()
file_name = os.path.basename(file)
s.send(bytes(file_name,'utf-8'))
open_file = (file, 'rb')
with open(file) as in_file:
file_data = in_file.read()
s.send(bytes(file_data,'utf-8'))
pyautogui.alert("File Transferred succefully!!")
if warning == 'Cancel':
exit()
if confirm_send == 'Cancel':
quit()
break
server.py
import socket
import pyautogui
from pyautogui import *
from tkinter import *
from tkinter import filedialog
import os
from infi.systray import SysTrayIcon
systray = SysTrayIcon("cloud.ico", "Cloud Storage")
systray.start()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',4321))
s.listen(5)
root = Tk()
root.withdraw()
while True:
clientsocket, address = s.accept()
print(f"Connecting from {address} has been established")
#getting folder name
msg0 = clientsocket.recv(1024)
folder_name = (msg0.decode('utf-8'))
#getting file name
msg = clientsocket.recv(1024)
file_name = (msg.decode("utf-8"))
#getting file data
msg2 = clientsocket.recv(1024)
file_data = msg2.decode('utf-8')
#checking folder name
if folder_name == 'Shashankh':
a = open(f"D:\Cloud Storage\Shashankh\{file_name}", "wb")
a.write(bytes(file_data,'utf-8'))
a.close()
elif folder_name == 'Eshitha':
a = open(f"D:\Cloud Storage\Eshitha\{file_name}", "wb")
a.write(file_data)
a.close()
elif folder_name == 'Hari':
a = open(f"D:\Cloud Storage\Hari\{file_name}", "wb")
a.write(file_data)
a.close()
elif folder_name == 'Prasanna':
a = open(f"D:\Cloud Storage\Prasanna\{file_name}", "wb")
a.write(file_data)
a.close()
pyautogui.alert("File recieved successfully! | Either you have recieved a file or Transfer has been aborted by user |")
Ответ №1:
Во-первых, потрясающая программа!
Похоже, вы пропустили ключевое слово в строке 45 в своем client.py файл. следующим образом
s.send(bytes(file_name,'utf-8'))
Вы должны упомянуть параметр, известный как кодировка. это позволит получить доступ к формату кодировки (например,utf-8), поэтому ниже приведен исправленный код..
s.send(bytes(file_name,encoding='utf-8'))
Надеюсь, это сработает. Я бы с удовольствием посмотрел, как это работает.
Комментарии:
1. Привет! спасибо за оценку. проблема, с которой я столкнулся, заключалась не в имени файла, то есть
somefile.zip
проблема заключалась в отправке файла. когда я отправляю zip-файл, я получаю эту ошибку, также, пожалуйста, проверьте мой код еще раз.. я отредактировал его. Спасибо!