diff --git a/app.py b/app.py index 39ebb56..740118c 100755 --- a/app.py +++ b/app.py @@ -208,24 +208,52 @@ def get_upload_candidate_list(host_local, port, media_list): print("Response not ok !") return [] +def read_in_chunks(file_object, chunk_size=102400): + while True: + data = file_object.read(chunk_size) + if not data: + break + yield data def HTTP_upload(file_dict, host_local, port): ''' Build HTTP file upload request and send it. + https://stackoverflow.com/questions/43383823/python-flask-chunk-data-upload-not-working/70894476#70894476 ''' - url = "https://" + host_local + ":" + str(port) + "/upload" + global current_upload http_headers_data_mime = http_headers.copy() http_headers_data_mime["content-type"] = "" - files = {"file": (file_dict["filename"], open(media_folder_local + file_dict["filename"], "rb"), "multipart/form-data")} - if debug: - print(files) - response = requests.post(url, files=files, headers=http_headers, verify=CAfile) - if debug: - print(response.text) - if response.ok: - return 1 - else: - return 0 + file_path = os.path.join(media_folder_local, file_dict["filename"]) + part_size = int(file_dict["size"] / 10) + if part_size < 102400: + part_size = 102400 + url = "https://" + host_local + ":" + str(port) + "/upload/" + file_dict["filename"] + "/" + str(part_size) + with open(file_path, "rb") as ul_file: + try: + for data in read_in_chunks(ul_file, chunk_size=part_size): + print(len(data)) + # ~ files = {"file": (file_dict["filename"], data, "multipart/form-data")} + # ~ files = {"file": (file_dict["filename"], "multipart/form-data")} + # ~ response = requests.post(url, files=files, headers=http_headers, verify=CAfile) + response = requests.post(url, data=data, headers=http_headers, verify=CAfile) + # ~ response = requests.post(url, data=data, headers=http_headers, verify=CAfile) + if debug: + print(response.text) + transferred_mb = len(data) / 1024 / 1024 + current_upload["transferred_size"] += round(transferred_mb) + current_upload["transferred_percent"] += round(100 / current_upload["total_size"] * transferred_mb) + except Exception as e: + print(e) + # ~ files = {"file": (file_dict["filename"], open(media_folder_local + file_dict["filename"], "rb"), "multipart/form-data")} + # ~ if debug: + # ~ print(files) + # ~ response = requests.post(url, files=files, headers=http_headers, verify=CAfile) + # ~ if debug: + # ~ print(response.text) + # ~ if response.ok: + # ~ return 1 + # ~ else: + # ~ return 0 def list_media_files(folder): @@ -315,8 +343,8 @@ def sync_media_folder(media_folder_local, media_folder_remote, host_local, port, if debug: print("File size: " + str(round(current_media_size))) media_count += 1 - current_upload["transferred_size"] += round(current_media_size) - current_upload["transferred_percent"] += round((100 / total_size) * current_media_size) + # ~ current_upload["transferred_size"] += round(current_media_size) + # ~ current_upload["transferred_percent"] += round((100 / total_size) * current_media_size) else: # Upload interrupted return _("Upload interrupted") @@ -502,7 +530,7 @@ def send_pilpil_command(host, arg0, arg1, arg2): HTTP_request = HTTP_request + "&val=" + arg1 elif (arg0 == "enqueue") or (arg0 == "add"): # Add 'input' url parameter - HTTP_request = HTTP_request + "&input=file://" + quote(media_folder_remote_expanded) + "/" + arg1 + HTTP_request = HTTP_request + "&input=file://" + os.path.join(quote(media_folder_remote_expanded),arg1) # Send request and get data response data = send_HTTP_request(host, port_, time_out=3, request_=HTTP_request) diff --git a/changelog_todo.md b/changelog_todo.md index 0c0ad74..d1b41d0 100644 --- a/changelog_todo.md +++ b/changelog_todo.md @@ -70,11 +70,13 @@ sha256 : 401359a84c6d60902c05602bd52fae70f0b2ecac36d550b52d14e1e3230854a6 # DOING NEXT : - + * server : remove incomplete files before upload * webgui/server : interrupt current download ? + * webgui : upload status CSS transition ? # DONE : + * server : upload in chunks * webgui: remove file from timeline (drag&drop to bin?) (check bugs) * webgui: upload progress dialog * server : file upload : only send new files, get upload status (/sync/status)