2009-08-11 28 views
8

Tôi có một số mô hình django sử dụng FileField và người dùng đã tải lên các tệp trong giao diện quản trị. Bây giờ chúng tôi gặp sự cố rằng một số tệp khá lớn (1-3G), điều này khiến cho việc tải lên http trở nên khó khăn.Phương pháp tải lên thay thế cho Django FileField

Có lớp "vùng chứa" và sau đó là các lớp "tệp" có FK vào vùng chứa. Tôi đã sử dụng inline trong gui quản trị để làm cho điều này dễ dàng hơn cho người dùng (dạng lớp container, với lớp nội tuyến lớp)

Tôi đã tìm thấy FilePathField, mà tôi đoán sẽ hữu ích để cho phép người dùng scp/rsync tập tin qua máy chủ và sau đó duyệt và thêm chi tiết cho họ, nhưng làm thế nào tôi có thể nhận được điều này trong admin? Tôi có cần xây dựng một biểu mẫu/chế độ xem mới để tạo các đối tượng không? Có cách nào để bằng cách nào đó ghi đè lên các mô hình trong một hình thức admin tùy chỉnh (và do đó giữ tất cả sự tốt đẹp admin miễn phí), mà thay thế filefield với filepathfield? Bất cứ một đề nghị nào khác?

Cảm ơn mọi đề xuất!

+1

tò mò muốn xem những gì phản hồi là, tôi cần phải giải quyết vấn đề tương tự này sớm - rất nhiều tệp từ 100-200mb, được tải lên qua quản trị viên tới S3. –

+0

Tôi đã thực hiện một hình thức với FilePathField mà hoạt động ok-ish, nhưng cần một tải lại của máy chủ web để xem các tập tin mới:/- vẫn đang tìm kiếm lựa chọn thay thế! – user130924

Trả lời

0

Tôi không chắc liệu tôi có hiểu những gì bạn muốn đưa vào khu vực quản trị hay không. Bạn đang tìm kiếm một cách tự động hóa quá trình tải lên tệp với giao thức truyền khác với HTTP?

Nếu có, bạn có thể tạo một mô hình với một CharField cơ bản (hoặc có thể là một URLField), và sau đó thực hiện một bản sao rsync hoặc scp khi đối tượng được lưu. Ví dụ:

from django.db import models 

class File(models.Model): 
    path = models.CharField() 
    def save(self): 
     import os 
     # WARNING! The path given by the user should be sanitized; this is 
     # example code only. This is a security vulnerability. 

     # Attempt to rsync the target file from a remote machine 
     exit_code = os.system("rsync %s /incoming/files/path/" % self.path) 
     # Make sure it worked before saving 
     if exit_code == 0: 
     super(File, self).save() # Call the "real" save() method 
     else: 
     # Raise exception 

Đây là ví dụ rất khó, nhưng nó sẽ giúp bạn tìm ra điều gì đó. Bạn cần phải đảm bảo rằng thường trình của bạn an toàn (đường dẫn không đúng định dạng có thể cho phép người dùng chạy bất kỳ thứ gì họ muốn, ví dụ). Ngoài ra, điều này có khả năng sẽ chặn thói quen lưu Django trong khi sao chép qua một tệp, vì vậy bạn nên xem xét việc chạy lệnh ưa thích của mình trong một quy trình riêng biệt.

Chúc may mắn!

0

Tôi không có chuyên gia trong việc chuyển các tệp lớn, nhưng nếu người dùng của bạn cần để có thể làm điều đó mà không có "câu lệnh UNIX", tôi khuyên bạn nên xem xét việc tạo một applet Java cho nó. Nó sẽ là rất nhiều công việc, nhưng sau đó bạn có thể có thanh tiến độ thích hợp vv

2

Bạn đề cập rằng FilePathField hoạt động, nhưng cần phải khởi động lại máy chủ web để xem tệp mới. Điều này xảy ra vì các tùy chọn được thu thập FilePathField.__init__, được gọi là một lần khi mô-đun được nhập.

Một sửa chữa sẽ được tái gọi của __init__ trong lĩnh vực của hình thức __init__:

def __init__(self, **kwargs): 
    super(MyForm, self).__init__(**kwargs) 
    self.fields['file'].__init__(path) 

(Bằng cách đó các thư mục được quét mỗi lần mẫu được instanced.)

Các vấn đề liên quan