You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不借助表单直接调用方法使用s3upload上传文件?

Programmatically Upload Files to S3 with django-s3-upload (No File Picker Needed)

Absolutely, this is totally feasible! You can skip the browser's file picker and trigger uploads programmatically by leveraging the core workflow of the django-s3-upload library. Here's how to do it, broken down into clear steps:

How It Works Under the Hood

The library follows a two-step process:

  1. Request a signed S3 upload form/URL from your Django backend (handled by the get_upload_signature view).
  2. Directly upload the file to S3 using the signed credentials, no intermediary server storage required.

We'll replicate this flow programmatically, either from your Django backend or frontend.

Option 1: Backend-Side Upload (Python)

If you want to upload files directly from your server (e.g., a local file path), use this approach:

import requests
from django.core.files import File
from django.http import HttpRequest
from s3upload.views import get_upload_signature

def upload_to_s3_programmatically(file_path, dest="options"):
    # 1. Create a mock request (required for the get_upload_signature view)
    mock_request = HttpRequest()
    mock_request.method = "POST"
    # If your view requires CSRF (default), add a token (or disable CSRF for this view if safe)
    mock_request.META["CSRF_COOKIE"] = "dummy-csrf-token"

    # 2. Fetch signed upload parameters from the library's view
    response = get_upload_signature(mock_request, dest)
    upload_data = response.json()

    # 3. Read the local file and prepare form data for S3
    with open(file_path, "rb") as f:
        file_obj = File(f)
        form_data = upload_data["form"]
        form_data["file"] = file_obj

        # 4. Upload directly to S3
        s3_response = requests.post(upload_data["url"], data=form_data)
        s3_response.raise_for_status()  # Raise error if upload fails

    # Return the S3 object key (you can save this to your model if needed)
    return upload_data["form"]["key"]

# Usage example
uploaded_key = upload_to_s3_programmatically("/path/to/filename.jpg")

Option 2: Frontend-Side Upload (JavaScript)

If you want to trigger uploads from the browser without a file picker (e.g., using a Blob or generated file), use this code:

// Helper to get Django's CSRF token
function getCsrfToken() {
    return document.querySelector('[name=csrfmiddlewaretoken]').value;
}

async function uploadFileProgrammatically(fileBlob) {
    try {
        // 1. Fetch signed upload credentials from your backend
        const signatureResponse = await fetch("/s3upload/sign/", {
            method: "POST",
            headers: {
                "X-CSRFToken": getCsrfToken(),
                "Content-Type": "application/json"
            },
            body: JSON.stringify({ dest: "options" })
        });

        const uploadInfo = await signatureResponse.json();

        // 2. Prepare form data for S3 upload
        const formData = new FormData();
        Object.entries(uploadInfo.form).forEach(([key, value]) => {
            formData.append(key, value);
        });
        formData.append("file", fileBlob); // Pass your Blob/File object here

        // 3. Upload directly to S3
        const s3Response = await fetch(uploadInfo.url, {
            method: "POST",
            body: formData
        });

        if (!s3Response.ok) throw new Error("S3 upload failed");

        console.log("Upload successful! S3 Key:", uploadInfo.form.key);
        return uploadInfo.form.key;
    } catch (error) {
        console.error("Upload error:", error);
        throw error;
    }
}

// Usage example: Upload a generated Blob
const imageBlob = new Blob(["your image data here"], { type: "image/jpeg" });
uploadFileProgrammatically(imageBlob).then(key => {
    // Do something with the S3 key (e.g., save to your backend)
});

Key Configuration Notes

  • Ensure your CONSTANCE_ADDITIONAL_FIELDS is correctly set (your existing config looks good with dest: 'options').
  • Verify your Django settings for django-s3-upload are complete (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_STORAGE_BUCKET_NAME, etc.).
  • For frontend uploads: Update your S3 bucket's CORS policy to allow requests from your domain. Example CORS rule:
    <CORSRule>
        <AllowedOrigin>https://your-domain.com</AllowedOrigin>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    

内容的提问来源于stack exchange,提问作者Konstantin Kozirev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:17:30