2009-02-26 31 views
9

Ok tôi đã có một chút vấn đề thú vị trên tay. Dưới đây là một chút nền:Thực tiễn tốt nhất để xem thư mục tải lên?

Tôi đang viết triển khai dịch vụ thư viện phương tiện sẽ phân phát URL tới trình phát flash ở đầu phía trước. Khách hàng muốn có thể đẩy nội dung vào dịch vụ bằng cách tải tệp lên một số siêu dữ liệu vào thư mục FTP - tôi có quyền kiểm soát lược đồ siêu dữ liệu. Dịch vụ xem thư mục này sẽ nhận bất kỳ tệp mới nào, sao chép chúng vào thư mục "nội dung", sau đó đẩy dữ liệu meta và url vào nội dung xuống dịch vụ nội dung và vào cơ sở dữ liệu.

Dịch vụ nội dung không thành vấn đề. Xem một thư mục FTP là.

Triển khai hiện tại của tôi sử dụng đối tượng FileSystemWatcher với bộ lọc cho tệp xml.

Có thể có nhiều tệp cho mỗi mục nội dung, ví dụ: video chất lượng cao, trung bình, chất lượng thấp.

Tôi dự định thực thi theo quy trình hoặc bằng công cụ để nội dung được sắp xếp thành các thư mục riêng chỉ ngắn gọn nhưng điều này thực sự không phải là vấn đề.

Các tập tin xml sẽ xem xét một chút như thế này:

<media> 
    <meta type="video"> 
    <name>The Name Displayed</name> 
    <heading>The title of the video</heading> 
    <description> 
     A lengthy description about the video.. 
    </description> 
    <length>00:00:19</length> 
</meta> 
<files> 
    <video file="somevideo.flv" quality="low"/> 
    <video file="somevideo.flv" quality="medium"/> 
    <video file="somevideo.flv" quality="high"/> 
</files> 
</media> 

Vì vậy, khi một tập tin mới được tạo ra sự kiện cháy FileSystemWatcher.Created. Tôi có một chuỗi riêng biệt đang chạy để xử lý nội dung chia sẻ hàng đợi với quy trình dịch vụ chính (đừng lo lắng nó sử dụng mẫu người tiêu dùng của nhà sản xuất như được mô tả chi tiết tại đây: http://msdn.microsoft.com/en-us/library/yy12yx1f.aspx).

Tất cả đều hoạt động tốt, nhưng bây giờ tôi đang chạy vào các trường hợp cạnh trái phải và chính giữa!

Tôi đã tính đến việc các video sẽ mất nhiều thời gian tải lên hơn để bộ xử lý cố gắng lấy khóa độc quyền, nếu không thành công, nó sẽ di chuyển mục vào phía sau hàng đợi và chuyển sang mục tiếp theo.

  • Điều gì sẽ xảy ra nếu dịch vụ gặp sự cố hoặc đã có tệp ở đó? vì vậy tôi đã viết một phương thức để xếp hàng một tệp hiện có.
  • Điều gì xảy ra nếu các tệp đang được tải lên khi đang xếp hàng các tệp hiện có? Hy vọng rằng nó sẽ xử lý này? Tôi có nên định kỳ quét lại thư mục để xem tôi có bị mất gì không?

Có ai khuyên bạn nên thực hành tốt nhất cho trường hợp này không? Là hệ thống tập tin đồng hồ một ý tưởng hay nên các dịch vụ chỉ định kỳ quét thư mục?

Chỉnh sửa: Chỉ để cung cấp cho bạn một số ý tưởng về quy mô. Chúng ta đang nói 10 trong tổng số 1000 mặt hàng. Có thể được tải lên theo khối lớn.

Trả lời

3

FileSystemWatcher là một cách thực dụng để có khả năng hiển thị sớm tệp thả xuống, nhưng có rất nhiều trường hợp cạnh có thể gây ra các sự kiện bị nhỡ. Bạn vẫn sẽ cần một lần quét định kỳ để chắc chắn.

Để tránh nhiều vấn đề về mutex; khách hàng có thể tải lên dưới dạng foo.xml.upload và sau đó đổi tên thành foo.xml một ở đó không? Điều đó sẽ tránh được một tệp bị khóa dài ... (bạn chỉ cần bỏ qua các tệp tải lên).

Ngoài ra: hãy cẩn thận "không được phát minh ở đây" ... có nhiều tiện ích hiện có theo dõi thư mục; BizTalk cho (một ví dụ quá mức). Tôi không nói "không tự mình làm", nhưng ít nhất hãy xem xét các tùy chọn đóng hộp trước.

+0

Tôi sẽ xem xét các giải pháp của bên thứ ba. Tôi nghĩ rằng không phát minh ra ở đây có thể đi vào nó. Tôi đã bị loại lại vì đã đề xuất Fluent Nhibernate và được yêu cầu sử dụng LINQ to Sql. Phải nhận được sự chấp thuận cho bất kỳ công cụ của bên thứ ba nào - mất một tuổi. –

+0

@ RobStevenson-Leggett Bạn đã tìm thấy giải pháp của bên thứ ba chưa? hoặc bạn đã tự mình làm ra? – phuzi

0

Bạn có thể muốn chạy dịch vụ web tại nơi người tải lên có thể ping khi hoàn thành tải lên. chỉ một url sẽ làm tốt, như "http://www.bigtimecompany.com/ftpuploadcomplete.php", khi được gọi, hãy kích hoạt bất kỳ chương trình nào kiểm tra thư mục ftp.

1

Một lỗ hổng phổ biến khi xem tệp tạo là bạn có thể nhận sự kiện trước khi quá trình tải lên hoàn tất, vì vậy bạn sẽ xử lý tệp chưa hoàn tất.

Tất nhiên bạn có thể kiểm tra điều đó, vì xml của tệp không hoàn chỉnh sẽ không được định dạng đúng. Nhưng một giải pháp tốt hơn IMO là để người tải lên ghi vào một tệp tạm thời, và sau khi hoàn thành việc tải lên, nó đổi tên tệp thành * .xml.

Đối với bản thân FileSystemWatcher, tôi ... đã không ngờ vực nó khi nó được sử dụng trên mạng chia sẻ (delete sự kiện không bao giờ bị sa thải). Vì vậy, tôi đã viết của riêng tôi 'watcher' có một giao diện tương tự như FSW, nhưng chỉ là bỏ phiếu cho thư mục để tạo/xóa/thay đổi tập tin. Không thanh lịch như FSW, nhưng đáng tin cậy hơn.

+0

Tôi đang làm tròn tệp được tải lên bằng cách cố gắng khóa nó định kỳ. –

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