df
This commit is contained in:
@@ -301,6 +301,74 @@ def create_app():
|
||||
logger.error(f"Index error: {e}", exc_info=True)
|
||||
return jsonify({"error": f"Indexing failed: {str(e)}"}), 500
|
||||
|
||||
@app.route("/files/upload", methods=["POST"])
|
||||
@require_auth()
|
||||
@require_storage()
|
||||
def upload_file():
|
||||
"""Upload a file into storage (multipart/form-data).
|
||||
|
||||
Accepts form fields:
|
||||
- file: uploaded file (required)
|
||||
- tag: repeated tag parameters or comma-separated string
|
||||
- url: repeated url parameters or comma-separated string
|
||||
"""
|
||||
from API.folder import API_folder_store
|
||||
from SYS.utils import sha256_file, sanitize_filename, ensure_directory, unique_path
|
||||
|
||||
if 'file' not in request.files:
|
||||
return jsonify({"error": "file required"}), 400
|
||||
file_storage = request.files.get('file')
|
||||
if file_storage is None:
|
||||
return jsonify({"error": "file required"}), 400
|
||||
|
||||
filename = sanitize_filename(file_storage.filename or "upload")
|
||||
incoming_dir = STORAGE_PATH / "incoming"
|
||||
ensure_directory(incoming_dir)
|
||||
target_path = incoming_dir / filename
|
||||
target_path = unique_path(target_path)
|
||||
|
||||
try:
|
||||
# Save uploaded file to storage
|
||||
file_storage.save(str(target_path))
|
||||
|
||||
# Extract optional metadata
|
||||
tags = []
|
||||
if 'tag' in request.form:
|
||||
# Support repeated form fields or comma-separated list
|
||||
tags = request.form.getlist('tag') or []
|
||||
if not tags and request.form.get('tag'):
|
||||
tags = [t.strip() for t in str(request.form.get('tag') or "").split(",") if t.strip()]
|
||||
|
||||
urls = []
|
||||
if 'url' in request.form:
|
||||
urls = request.form.getlist('url') or []
|
||||
if not urls and request.form.get('url'):
|
||||
urls = [u.strip() for u in str(request.form.get('url') or "").split(",") if u.strip()]
|
||||
|
||||
with API_folder_store(STORAGE_PATH) as db:
|
||||
db.get_or_create_file_entry(target_path)
|
||||
|
||||
if tags:
|
||||
db.add_tags(target_path, tags)
|
||||
|
||||
if urls:
|
||||
db.add_url(target_path, urls)
|
||||
|
||||
file_hash = sha256_file(target_path)
|
||||
|
||||
return (
|
||||
jsonify({
|
||||
"hash": file_hash,
|
||||
"path": str(target_path),
|
||||
"tags_added": len(tags),
|
||||
"url_added": len(urls),
|
||||
}),
|
||||
201,
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f"Upload error: {e}", exc_info=True)
|
||||
return jsonify({"error": f"Upload failed: {str(e)}"}), 500
|
||||
|
||||
# ========================================================================
|
||||
# TAG OPERATIONS
|
||||
# ========================================================================
|
||||
|
||||
Reference in New Issue
Block a user