2011-08-26 16 views
9

tôi có một phần quản trị của trang web của tôi nơi "tác giả" có thể tải lên tệp như ảnh cho thư viện ảnh , vv để bao gồm trong các phần nội dung động của trang web của tôi sau này. Tôi có một số trang mà bản thân html được lưu trữ trong cơ sở dữ liệu mySQL của tôi và người dùng có thể chỉnh sửa giao diện nội dung using ckeditor.trong asp.net-mvc, có một thư viện hay mô hình tốt để theo dõi khi lưu nội dung người dùng (hình ảnh, tệp, v.v.)

Tôi đang cố gắng xem có điều gì đó để tận dụng sẽ lưu tệp vào đúng thư mục và truy xuất chúng sau này hay tôi chỉ nên viết tất cả từ đầu. Ngoài ra, tìm kiếm các bài học và những điều cần cẩn thận (bảo mật, vv.)

Trả lời

10

Tôi sẽ thực hiện việc này. Một ứng dụng mà chúng tôi đã làm điều gì đó tương tự như chúng tôi đã làm và chúng tôi đã làm 'cuộn thứ của riêng mình'. Người dùng có thể tải lên các tập tin (hình ảnh, tài liệu, bất cứ điều gì) thông qua giao diện ứng dụng của chúng tôi và những tập tin này có quyền người dùng/công ty/vai trò nhạy cảm. Để giảm thiểu một số lo ngại về bảo mật và vì một vài lý do khác, chúng tôi đã thực hiện như sau.

  1. Trong ứng dụng web, chúng tôi đã tạo thư mục 'Tài sản' được sử dụng để lưu trữ tất cả nội dung do người dùng tạo. Sau đó chúng tôi sử dụng các thư mục con để giúp phân đoạn nội dung (biểu tượng, tệp, v.v.).

  2. Trong web.config, chúng tôi đã định cấu hình thư mục này để không thể truy cập được từ trình duyệt (nghĩ như thư mục App_Data hoặc bin) với các dòng sau đây (Chúng tôi đã thực hiện điều này để đảm bảo không thể truy cập trực tiếp vào các tệp này từ trình duyệt Xem thêm về điểm 4 #):.

    <system.webServer> 
    <security> 
        <requestFiltering> 
        <hiddenSegments> 
         <add segment="Assets"/> 
        </hiddenSegments> 
        </requestFiltering> 
    </security> 
    

  3. Khi một tập tin được tải lên, chúng tôi lưu trữ các thông tin có liên quan về các tập tin trong cơ sở dữ liệu (chủng loại, kích thước, tên, ý kiến). Điều này cũng cho phép chúng tôi liên kết thông tin bảo mật vai trò và người dùng trên tệp.

  4. Để truy xuất tệp, chúng tôi đã triển khai một bộ điều khiển có tên tệp và thông tin người dùng được yêu cầu (vì bạn phải đăng nhập) và trả về tệp từ thư mục Nội dung.Đối với người dùng cuối, có vẻ như tất cả các tệp được lưu trữ trong/Files/Docs/FileID hoặc một cái gì đó tương tự nhưng trong thực tế đây chỉ là một 'gatekeeper' front-end cho chính các tệp đó. Phương thức điều khiển/hành động này trả lại 404 nếu bạn không được ủy quyền hoặc nếu bạn yêu cầu một tệp không hợp lệ. Đối với cách đặt tên tệp, chúng tôi chỉ tạo ra GUID và đặt tên cho tập tin "GUID.relevantExtension" (kiểm tra một mà không tồn tại)

Tôi đoán cho bài học kinh nghiệm hoặc có điều gì, điều quan trọng nhất là bạn không hiển thị trực tiếp các tệp đặc biệt nếu người dùng không chia sẻ nội dung. Ngoài ra, và điều này có lẽ là sở thích cá nhân và có thể bắt đầu chiến tranh nếu không cẩn thận, tôi không lưu trữ tập tin trong cơ sở dữ liệu ở đó có vẻ như gây ra vấn đề về phân trang và lưu trữ bộ nhớ đệm (không nói về cột Tập tin SQL 2008). Hi vọng điêu nay co ich!

EDIT - Một ý nghĩ khác về việc này, hãy lưu ý khi xuất bản từ VS. Các tệp được tải lên này không phải là một phần của giải pháp của bạn và nếu bạn xóa Xóa xuất bản loại Tải lên, bạn sẽ xóa các tệp người dùng của mình. Chỉ cần lời cảnh báo (đã ở đó: /)

+1

Bạn cũng có thể đặt các tài sản bên ngoài webproject bạn/webroot. Bằng cách này nó không thể được truy cập trực tiếp và đồng thời bạn giải quyết vấn đề xuất bản, bởi vì thư mục sẽ không bị ghi đè. –

+0

@RobinvanderKnaap - đó là sự thật, chúng tôi chỉ không có tùy chọn đó với nhà cung cấp dịch vụ lưu trữ của chúng tôi :) – Tommy

+1

+1 cho cảnh báo chỉnh sửa ... đã phát hiện ra điều này một cách khó khăn. – BigMike

0

Tôi nghĩ bạn sẽ kết thúc bằng cách "viết tất cả từ đầu".

Đối với tôi, thư mục "Tệp" và sau đó tôi tạo thư mục con cho mỗi người dùng và nếu có nhiều loại tôi tạo trong thư mục con UserFolder này cho từng loại dữ liệu.

Trong DB i, tôi chỉ lưu trữ "Đường dẫn" để nhận các tệp này.

0

Nếu bạn tạo biểu mẫu có mã hóa dữ liệu nhiều phần/biểu mẫu thì bạn có thể nhận được HttpPostedFileBase trong Bộ điều khiển của mình.

Trong giao diện:

<form action="/MyController/MyAction/" method="post" enctype="multipart/form-data">

Trong Controller:

public ActionResult MyAction(HttpPostedFileBase httpPostedFileBase) { // Your code here. }

Đối số httpPostedFileBase sẽ được ánh xạ bởi mô hình mặc định chất kết dính.

0

Một hình ảnh thay đổi kích thước thư viện cho loại hình này của trang web CMS có sẵn here