2010-11-04 36 views
6

Trên trang web, có thể tách các tệp lớn thành các đoạn trước khi tệp được tải lên máy chủ không? Ví dụ: chia một tệp 10MB thành các khối 1MB và tải từng đoạn một lên trong khi hiển thị thanh tiến trình?Tách tệp trước khi tải lên?

Có vẻ như JavaScript không có bất kỳ khả năng thao tác tệp nào, nhưng về ứng dụng Flash và Java thì sao?

Điều này cần phải hoạt động trong IE6 +, Firefox và Chrome. Cập nhật: quên đề cập rằng (a) chúng tôi đang sử dụng Grails và (b) điều này cần phải chạy trên https.

+0

Điều này có thể xảy ra ở cả Flash và Java, nhưng tại sao? Điều này có ý nghĩa gì? Bạn có muốn bỏ qua các giới hạn về kích thước không? –

+0

Đây là một câu hỏi tương tự khác: http://stackoverflow.com/questions/3155587/how-to-zip-100-mb-files-during-before-upload-so-that-upload-speed-can-be-increa/ 3155613 # 3155613 – RyanW

+1

Tôi chủ yếu khám phá tùy chọn này để tránh phải xử lý các tệp máy chủ lớn bên. Nội dung của các tệp được tải lên sẽ cần phải được phân tích cú pháp và được lưu trữ trong một DB. Đối với một lượng lớn dữ liệu cùng một lúc, chúng tôi cần một nhóm chuyên dụng các chuỗi dài tồn tại ở đầu trước để chuyển tất cả dữ liệu, có thể là dịch vụ phụ trợ đầu tiên qua RPC và sau đó là chính DB. Sau đó, sẽ có vấn đề về xử lý dọn dẹp tệp, thử lại, máy chủ giao diện người dùng bị lỗi, quản lý bộ nhớ và v.v. Tất cả điều này là khả thi, nhưng nếu nó có thể được thực hiện ở phía khách hàng, tôi có thể nhận được giải pháp ra khỏi cửa nhanh hơn nhiều. –

Trả lời

4

Bạn có thể thử Plupload. Nó có thể được cấu hình để kiểm tra bất kỳ thời gian chạy nào có sẵn ở phía người dùng, có thể là - Flash, Silverlight, HTML5, Gears, v.v ... và sử dụng bất kỳ điều kiện nào đáp ứng các tính năng được yêu cầu đầu tiên. Trong số những thứ khác, nó hỗ trợ thay đổi kích thước hình ảnh (ở phía người dùng, bảo toàn dữ liệu EXIF ​​(!)), tải lên luồng và đa phần và chunking. Các tập tin có thể được chia nhỏ ở phía người dùng và được gửi tới trình xử lý phía máy chủ (yêu cầu một số dịch vụ bổ sung trên máy chủ) để các tệp lớn có thể được tải lên máy chủ có giới hạn kích thước tối đa được đặt thành giá trị thấp hơn nhiều sau đó kích thước của chúng, ví dụ. Và hơn thế nữa.

Một số thời gian chạy hỗ trợ https Tôi tin rằng, một số cần thử nghiệm. Dù sao, các nhà phát triển trên có khá đáp ứng những ngày này. Vì vậy, bạn có thể ít nhất là thử;)

1

Không có giải pháp JavaScript cho lựa chọn trình duyệt đó. Có File API nhưng trong khi nó hoạt động trong phiên bản Firefox và Chrome mới hơn, nó sẽ không xảy ra trong IE (không có dấu hiệu của nó trong bản beta IE9 nào cả).

Trong mọi trường hợp, đọc tệp cục bộ và tải tệp lên qua XMLHttpRequest không hiệu quả vì XMLHttpRequest không có khả năng gửi nhị phân thuần túy, chỉ văn bản Unicode. Bạn có thể mã hóa nhị phân thành văn bản bằng cách sử dụng cơ sở 64 (hoặc, nếu bạn thực sự chuyên dụng, mã hóa 7 bit tùy chỉnh của riêng bạn) nhưng điều này sẽ kém hiệu quả hơn việc tải lên tệp thông thường.

Bạn chắc chắn có thể tải lên bằng Flash (xem SWFUpload et al), hoặc thậm chí Java nếu bạn phải (Jumploader ... Tôi sẽ không bận tâm, những ngày này), vì tỷ lệ Flash rất cao và plugin Java tiếp tục giảm). Bạn sẽ không nhất thiết phải kiểm soát mức độ thấp để chia thành nhiều phần, nhưng bạn có thực sự cần điều đó không? Để làm gì?

Một cách tiếp cận khác có thể là sử dụng trường tải lên tệp HTML tiêu chuẩn và khi gửi xảy ra, hãy đặt một cuộc gọi khoảng để thăm dò ý kiến ​​máy chủ với XMLHttpRequest, hỏi xem tệp tải lên có xa bao lâu không. Điều này đòi hỏi một chút công việc ở cuối máy chủ để lưu trữ tiến độ tải lên hiện tại trong phiên hoặc cơ sở dữ liệu, vì vậy một yêu cầu khác có thể đọc nó. Nó cũng có nghĩa là sử dụng một thư viện phân tích biểu mẫu cung cấp cho bạn tiến trình gọi lại, mà hầu hết các ngôn ngữ chuẩn được tích hợp sẵn như PHP không.

Bất kể bạn làm gì, hãy tiếp cận phương pháp "nâng cao tiến bộ", cho phép các trình duyệt không có hỗ trợ để quay lại tải lên HTML thuần túy. Các trình duyệt thường có thanh tiến trình tải lên để tải lên tệp HTML, nó chỉ có xu hướng nhỏ và dễ bị bỏ qua.

+0

Flash không thể thực hiện điều đó. Nó có khả năng tải lên tệp nhưng nội dung tải lên bị ẩn khỏi mã máy khách. Không có quyền truy cập vào dữ liệu tệp thực tế. Các applet Java chưa được ký kết có lẽ cũng không thể thực hiện được. Tôi khá chắc chắn bạn sẽ cần phải sử dụng một applet Java đã ký. – Herms

+0

Hmmm, thanh đó ở phía dưới cùng của IE (6 & 7) tại nơi làm việc rất gây hiểu lầm: khi tôi gửi các tệp lớn (thường là 10–50 MB) thanh đầy * cách * sớm hơn quá trình tải tệp thực sự kết thúc. –

+0

Vâng. Chắc chắn có vấn đề với nó, đặc biệt là trong IE. Thật là buồn khi có nhiều nỗ lực đưa vào việc kiểm soát tải lên tệp HTML, khi nó có thể được giải quyết dễ dàng hơn nhiều với một công việc nhỏ từ các nhà cung cấp trình duyệt làm cho giao diện người dùng hiện tại của họ tốt hơn một chút. – bobince

2

Tùy chọn duy nhất tôi biết về điều đó sẽ cho phép điều này sẽ là một ứng dụng Java có chữ ký.

Ứng dụng chưa được ký và phim Flash không có quyền truy cập hệ thống tệp, vì vậy, họ sẽ không thể đọc dữ liệu tệp. Flash có thể tải lên các tệp nhưng hầu hết được xử lý bằng cách triển khai Flash tích hợp và từ những gì tôi nhớ nội dung tệp sẽ không bao giờ được hiển thị với mã của bạn.

+0

Từ Flash Player 10, bạn có thể đọc dữ liệu tệp bằng ActionScript: http://www.mikechambers.com/blog/2008/08/20/reading-and-writing-local-files-in-flash-player-10/ –

+0

Thú vị. Tôi không nhận ra họ đã thêm vào đó. – Herms

+0

Tôi đã "thực hiện thành công" việc tải lên tệp chunked trong Flash bằng FileReference. Tôi nói "thành công" vì flash phải đọc toàn bộ tập tin vào bộ nhớ. Tải lên tệp 700MB sẽ khiến flash không phản hồi trong 30 giây trước khi quá trình tải lên bắt đầu. – Dwayne

0

Bạn có đặc biệt cần hai số này ở dạng X không? Hay bạn đang cố gắng giải quyết các vấn đề gây ra bằng cách tải lên các tệp lớn? (ví dụ: không thể khởi động lại tải lên ở phía máy khách, phía máy chủ bị treo khi toàn bộ tệp được tải lên và được giữ trong bộ nhớ cùng một lúc)

Tìm kiếm thành phần tải lên trực tuyến. Nó phụ thuộc vào những gì công nghệ bạn đang làm việc với như mà thành phần bạn sẽ thích jsp, asp.net vv

http://krystalware.com/Products/SlickUpload/ một Đây là một phía máy chủ sản phẩm Dưới đây là một số gợi ý hơn để uploaders khác nhau http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx

một số cố gắng quản lý bộ nhớ trên máy chủ, ví dụdo đó, toàn bộ tệp lớn không có trong bộ nhớ cùng một lúc, một số cố gắng quản lý trải nghiệm phía ứng dụng khách.

+0

Công nghệ giao diện người dùng đằng sau những "thành phần tải lên trực tuyến" này như SlickUpload là gì? Họ có thể thao tác các tệp trước khi tải lên không? –

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