| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
|
|
| import os |
| import uuid |
| import requests |
| from urllib.parse import urlparse, parse_qs |
| import mimetypes |
|
|
| def get_extension_from_url(url): |
| """Extract file extension from URL or content type. |
| |
| Args: |
| url (str): The URL to extract the extension from |
| |
| Returns: |
| str: The file extension including the dot (e.g., '.jpg') |
| |
| Raises: |
| ValueError: If no valid extension can be determined from the URL or content type |
| """ |
| |
| parsed_url = urlparse(url) |
| path = parsed_url.path |
| if path: |
| ext = os.path.splitext(path)[1].lower() |
| if ext: |
| return ext |
|
|
| |
| try: |
| response = requests.head(url, allow_redirects=True) |
| content_type = response.headers.get('content-type', '').split(';')[0] |
| ext = mimetypes.guess_extension(content_type) |
| if ext: |
| return ext.lower() |
| except: |
| pass |
|
|
| |
| raise ValueError(f"Could not determine file extension from URL: {url}") |
|
|
| def download_file(url, storage_path="/tmp/"): |
| """Download a file from URL to local storage.""" |
| |
| os.makedirs(storage_path, exist_ok=True) |
| |
| file_id = str(uuid.uuid4()) |
| extension = get_extension_from_url(url) |
| local_filename = os.path.join(storage_path, f"{file_id}{extension}") |
|
|
| try: |
| response = requests.get(url, stream=True) |
| response.raise_for_status() |
|
|
| with open(local_filename, 'wb') as f: |
| for chunk in response.iter_content(chunk_size=8192): |
| if chunk: |
| f.write(chunk) |
|
|
| return local_filename |
| except Exception as e: |
| if os.path.exists(local_filename): |
| os.remove(local_filename) |
| raise e |
|
|
|
|