aboutsummaryrefslogtreecommitdiff
path: root/uploader/files
diff options
context:
space:
mode:
Diffstat (limited to 'uploader/files')
-rw-r--r--uploader/files/functions.py11
-rw-r--r--uploader/files/views.py43
2 files changed, 38 insertions, 16 deletions
diff --git a/uploader/files/functions.py b/uploader/files/functions.py
index 5a3dece..7b9f06b 100644
--- a/uploader/files/functions.py
+++ b/uploader/files/functions.py
@@ -10,12 +10,15 @@ from werkzeug.datastructures import FileStorage
from .chunks import chunked_binary_read
-def save_file(fileobj: FileStorage, upload_dir: Path) -> Path:
+def save_file(fileobj: FileStorage, upload_dir: Path, hashed: bool = True) -> Path:
"""Save the uploaded file and return the path."""
assert bool(fileobj), "Invalid file object!"
- hashed_name = hashlib.sha512(
- f"{fileobj.filename}::{datetime.now().isoformat()}".encode("utf8")
- ).hexdigest()
+ hashed_name = (
+ hashlib.sha512(
+ f"{fileobj.filename}::{datetime.now().isoformat()}".encode("utf8")
+ ).hexdigest()
+ if hashed else
+ fileobj.filename)
filename = Path(secure_filename(hashed_name)) # type: ignore[arg-type]
if not upload_dir.exists():
upload_dir.mkdir()
diff --git a/uploader/files/views.py b/uploader/files/views.py
index cd5f00f..8d81654 100644
--- a/uploader/files/views.py
+++ b/uploader/files/views.py
@@ -8,6 +8,11 @@ from .chunks import chunk_name, chunks_directory
files = Blueprint("files", __name__)
+def target_file(fileid: str) -> Path:
+ """Compute the full path for the target file."""
+ return Path(app.config["UPLOAD_FOLDER"], fileid)
+
+
@files.route("/upload/resumable", methods=["GET"])
def resumable_upload_get():
"""Used for checking whether **ALL** chunks have been uploaded."""
@@ -21,9 +26,24 @@ def resumable_upload_get():
"statuscode": 400
}), 400
+ # If the complete target file exists, return 200 for all chunks.
+ _targetfile = target_file(fileid)
+ if _targetfile.exists():
+ return jsonify({
+ "uploaded-file": _targetfile.name,
+ "original-name": filename,
+ "chunk": chunk,
+ "message": "The complete file already exists.",
+ "statuscode": 200
+ }), 200
+
if Path(chunks_directory(fileid),
chunk_name(filename, chunk)).exists():
- return "OK"
+ return jsonify({
+ "chunk": chunk,
+ "message": f"Chunk {chunk} exists.",
+ "statuscode": 200
+ }), 200
return jsonify({
"message": f"Chunk {chunk} was not found.",
@@ -52,16 +72,15 @@ def resumable_upload_post():
"resumableFilename", default="", type=str) or ""
_fileid = request.form.get(
"resumableIdentifier", default="", type=str) or ""
- _targetfile = Path(app.config["UPLOAD_FOLDER"], _fileid)
+ _targetfile = target_file(_fileid)
if _targetfile.exists():
return jsonify({
- "message": (
- "A file with a similar unique identifier has previously been "
- "uploaded and possibly is/has being/been processed."),
- "error": "BadRequest",
- "statuscode": 400
- }), 400
+ "uploaded-file": _targetfile.name,
+ "original-name": _uploadfilename,
+ "message": "File was uploaded successfully!",
+ "statuscode": 200
+ }), 200
try:
chunks_directory(_fileid).mkdir(exist_ok=True, parents=True)
@@ -78,14 +97,14 @@ def resumable_upload_post():
chunks_directory(_fileid).rmdir()
return jsonify({
"uploaded-file": _targetfile.name,
+ "original-name": _uploadfilename,
"message": "File was uploaded successfully!",
"statuscode": 200
}), 200
return jsonify({
- "message": "Some chunks were not uploaded!",
- "error": "ChunksUploadError",
- "error-description": "Some chunks were not uploaded!"
- })
+ "message": f"Chunk {int(_chunk)} uploaded successfully.",
+ "statuscode": 201
+ }), 201
except Exception as exc:# pylint: disable=[broad-except]
msg = "Error processing uploaded file chunks."
app.logger.error(msg, exc_info=True, stack_info=True)