2009-02-24 11 views
36

Tôi đang làm việc trên một ứng dụng web. Có một nơi mà người dùng có thể tải tệp lên bằng giao thức HTTP. Có một sự lựa chọn giữa kiểm soát tải lên tệp HTML cổ điển và một ứng dụng Java để tải lên các tệp.Cách tốt nhất để tải lên nhiều tệp từ trình duyệt

Tải lên tệp HTML cổ điển không tuyệt vời vì bạn chỉ có thể chọn một tệp một lúc và rất khó để có được bất kỳ chỉ báo tiến trình nào trong quá trình tải lên thực tế (cuối cùng tôi đã sử dụng bộ đếm thời gian làm mới chỉ báo tiến trình với dữ liệu được tìm nạp từ máy chủ thông qua cuộc gọi AJAX). Ưu điểm: nó luôn hoạt động.

Với Java applet, tôi có thể thực hiện nhiều việc hơn: chọn nhiều tệp cùng một lúc (ngay cả thư mục), nén tệp, nhận thanh tiến trình thực, tệp drag'n'drop trên applet, v.v ...
NHƯNG có một vài nhược điểm:

  • đó là một cơn ác mộng để làm cho nó hoạt động đúng trên Mac Safari và Mac Firefox (Cảm ơn LiveConnect)
  • UI là không chính xác giao diện người dùng tự nhiên và một số người nhận thấy rằng
  • applet không đáp ứng được nhu cầu (có thể là lỗi của tôi, nhưng mọi thứ đều ổn với tôi)
  • có lỗi trong lớp Java UrlConnection với HTTPS, vì vậy tôi sử dụng máy khách HTTP chung HTTP để thực hiện tải lên HTTP thực tế. Đó là một gói khá lớn và làm chậm việc tải file .jar
  • Apache HTTP thông thường khách hàng đôi khi rắc rối xảy ra thông qua proxy
  • thời gian chạy Java là khá lớn

Tôi đã duy trì này Java applet trong một thời gian nhưng bây giờ tôi đang chán với tất cả những hạn chế, và xem xét việc viết/mua một thành phần hoàn toàn mới để tải lên các tập tin này.

Câu hỏi

Nếu bạn có các yêu cầu sau:

  • upload nhiều file một cách dễ dàng từ trình duyệt, thông qua HTTP hoặc HTTPS
  • nén các tập tin để giảm thời gian tải lên
  • tải lên sẽ hoạt động trên bất kỳ nền tảng nào, với giao diện người dùng gốc
  • phải có khả năng tải lên các tệp lớn, tối đa 2GB t nhất
  • bạn có carte blanche trên công nghệ

công nghệ gì/compontent bạn sẽ sử dụng?


Edit:

  • Kéo và Thả các tập tin trên các thành phần sẽ là một cộng tuyệt vời.
  • Dường như có rất nhiều sự cố liên quan đến lỗi với Trình phát Flash (swfupload known issues). Hỗ trợ Mac phù hợp và tải lên thông qua proxy với xác thực là các tùy chọn mà tôi không thể làm mà không có. Điều này có lẽ sẽ loại trừ tất cả các tùy chọn dựa trên Flash :-(.
  • Tôi loại trừ tất cả các tùy chọn chỉ HTML/Javascript vì bạn không thể chọn nhiều tệp cùng lúc với điều khiển HTML cổ điển. Đó là một nỗi đau khi nhấp vào nút "duyệt" lần n lần khi bạn muốn chọn nhiều tệp trong một thư mục.
+2

Còn video tải lên có thể tiếp tục lại thì sao? Điều đó có vẻ thực sự quan trọng đối với tôi.Không ai muốn khởi động lại quá trình tải lên không thành công sau một vài giờ. –

+0

Đúng vậy, trong trường hợp đó tôi không nghĩ rằng bạn vẫn có thể sử dụng Flash, chỉ có Java (và Silverlight?) –

+0

Xin chào một Trình tải lên dựa trên Flash khác được tìm thấy tại http://digitarald.de/project/fancyupload/ –

Trả lời

4

OK đây là quan điểm của tôi về vấn đề này

tôi đã làm một số thử nghiệm với SWFUpload, và tôi có kinh nghiệm trước đây của tôi với Java, và kết luận của tôi là bất cứ công nghệ được sử dụng không có giải pháp hoàn hảo để làm cập trên trình duyệt: bạn sẽ luôn luôn kết thúc với lỗi khi tải lên các tập tin lớn, đi qua proxy, với ssl, vv ...

NHƯNG:

  • trình tải lên flash (thực sự là nhẹ), không cần sự cho phép của người dùng và có giao diện gốc hoàn toàn mát mẻ, tôi nghĩ rằng
  • trình tải lên java cần ủy quyền nhưng bạn có thể làm bất cứ điều gì bạn muốn các tệp được người dùng chọn (còn gọi là nén nếu cần) và kéo và thả hoạt động tốt. Hãy chuẩn bị cho một số lỗi sử thi debuggin 'mặc dù.
  • Tôi đã không nhận được một thay đổi để chơi với Silverlight miễn là tôi muốn có lẽ đó là câu trả lời thực sự, mặc dù công nghệ vẫn còn khá trẻ nên ... Tôi sẽ chỉnh sửa bài đăng này nếu tôi có cơ hội fiddle một chút với Silverlight

Cảm ơn tất cả câu trả lời !!

+1

Một lưu ý cho những người tìm kiếm câu trả lời này một vài năm. Chúng tôi đã sử dụng SWFUpload trong nhiều năm và, nói chung, nó hoạt động thực sự tốt. Một điều cần lưu ý là vì Flash Player 9 không gửi tiêu đề Cấp quyền, nên nó sẽ không hoạt động nếu bạn sử dụng Xác thực Windows Tích hợp hoặc máy chủ proxy yêu cầu xác thực. Vì lý do này, chúng tôi đã chuyển sang một giải pháp dựa trên HTML5. –

0

Có các điều khiển tải lên HTTP/HTTPS cho phép tải lên nhiều tệp. Here là một từ Telerik, mà tôi đã tìm thấy là vững chắc và đáng tin cậy. Phiên bản mới nhất có vẻ nhiều nhất nếu không phải tất cả các yêu cầu tính năng của bạn.

+0

không giống như Trình tải lên AJAX, phần này được liên kết với .NET, làm cho nó vô ích – Javier

+0

Ngoài ra, bạn không thể chọn một tệp cùng một lúc. Có lẽ bạn muốn nói về điều khiển tải lên của Silverlight telerik –

3

Có một số thành phần flash miễn phí tồn tại với khả năng tải lên nhiều tệp tốt đẹp. Chúng sử dụng lớp ActionRcripference của ActionScripts với một bộ nhận PHP (hoặc bất kỳ) nào ở phía máy chủ. Một số gần đây đã bị hỏng với sự ra mắt của FP10 nhưng tôi biết chắc chắn rằng swfupload sẽ hoạt động :)

Hy vọng điều này sẽ giúp!

0

Bạn có thể tải lên nhiều tệp với biểu mẫu HTTP, như Dave đã chỉ ra, nhưng nếu bạn đang sử dụng một cái gì đó ngoài những gì HTTP và Javascript cung cấp, tôi sẽ xem xét rất nhiều Flash. Thậm chí còn có một số giải pháp có sẵn cho nó như MultiPowUpload và nó cung cấp nhiều tính năng bạn đang tìm kiếm. Nó cũng dễ dàng hơn để có được thông tin tiến độ bằng cách sử dụng một khách hàng Flash hơn với các cuộc gọi AJAX từ Javascript vì bạn có một chút linh hoạt hơn.

0

Bạn có thể kiểm tra gói Tải lên tệp Apache Commons. Nó cho phép bạn tải lên nhiều tệp, theo dõi tiến trình tải lên và hơn thế nữa. Bạn có thể tìm thêm thông tin ở đây:

http://commons.apache.org/fileupload/
http://commons.apache.org/fileupload/using.html

Chúc may mắn

+1

Apache Commons Fileupload là một thư viện phía máy chủ java được sử dụng để phân tích cú pháp bài đăng tải lên http. Tôi đã có một phần làm việc. Tôi thực sự tập trung vào phần khách hàng. –

5

tôi thực hiện một cái gì đó rất gần đây trong Silverlight.

Về cơ bản, sử dụng HttpWebRequest để gửi một đoạn dữ liệu đến GenericHandler.

Trên bài đăng đầu tiên, 4KB dữ liệu được gửi. Vào đoạn 2, tôi gửi một đoạn 4K khác.

Khi nhận được đoạn thứ 2, tôi tính toán chuyến đi khứ hồi giữa đoạn thứ nhất và thứ 2 và bây giờ đoạn thứ 3 khi được gửi sẽ biết để tăng tốc độ.

Sử dụng phương pháp này tôi có thể tải lên các tệp có kích thước BẤT K and và tôi có thể tiếp tục.

Mỗi bài tôi gửi cùng thông tin này:

[THÔNG SỐ] [fileData]

Ở đây, các thông số nội dung chính sau: [Chunk #] [Filename] [Session ID]

Sau mỗi đoạn nhận được, tôi gửi một phản hồi về Silverlight của tôi cho biết nhanh như thế nào để nó bây giờ có thể gửi một đoạn lớn hơn .

Khó để đặt giải thích của tôi mà không có mã nhưng đó là cơ bản như thế nào tôi đã làm nó.

Tại một thời điểm nào đó, tôi sẽ cùng nhau viết một cách nhanh chóng về cách tôi đã thực hiện việc này.

+0

Âm thanh tuyệt vời, tôi cũng muốn thử làm điều này. Tôi thích rằng cuối cùng chúng ta có thể thao tác các tệp ở phía máy khách bằng mã được quản lý! Long Live Silverlight! – TJB

+0

Bạn có gặp sự cố trong trình phát siverlight liên quan đến quản lý cookie trình duyệt, proxy, hỗ trợ nền tảng không? –

+0

Silverlight chạy ở phía máy khách và trình xử lý tải lên của tôi là phía máy chủ. Vì cả hai đều được tách ra khỏi phiên, tôi sẽ chuyển ID phiên sang Silverlight khi khởi động. Trong khi tải lên, phiên sau đó được chuyển từ Silverlight sang trình xử lý, do đó giữ tất cả trong một phiên – Gautam

5

Tôi chưa bao giờ sử dụng tệp này với kích thước 2GB, nhưng YUI File Uploader hoạt động khá tốt trên một dự án trước đó. Bạn cũng có thể quan tâm đến điều này jQuery Plugin.

Điều đó nói rằng, tôi vẫn nghĩ rằng Java Applet là con đường để đi. Tôi nghĩ rằng bạn sẽ kết thúc với ít vấn đề về tính di động và giao diện người dùng hơn mong đợi và Drag/Drop hoạt động tốt. Đối với hồ sơ, Box.net sử dụng Java Applet để tải lên nhiều tệp nhanh chóng của họ.

+0

Box.net sử dụng thành phần flash làm tùy chọn đầu tiên cho video tải lên của họ. Thành phần đó sau đó cung cấp một liên kết đến một applet java cho người dùng muốn sử dụng "drag'n'drop" –

1

còn khoảng google gears?

+0

Ý tưởng hay, nhưng có gì đáng sợ một chút là nó không hỗ trợ trên Mac OS X Snow Leopard: Snow Leopard đã ra mắt trong 2 tháng !! Tôi sẽ thử điều đó trên Firefox càng sớm càng tốt vì tò mò;) Cảm ơn! –

2

gì về hai Jupload http://jupload.sourceforge.net/ và jumploader http://jumploader.com/

Cả hai đều là applet java nhưng họ cũng đều thực sự dễ sử dụng và thực hiện.

+0

Vâng, tôi đã nghe nói về JUpload, chưa bao giờ có cơ hội/thời gian để thực sự căng thẳng kiểm tra nó một chút. Tôi biết rằng tải lên qua https là vấn đề nói chung (vấn đề nằm trong bản thân việc thực hiện JDK. Nếu JUpload sử dụng việc thực thi mặc định, nó có thể bị vấn đề). –

+0

Giới thiệu về Jumploader: Giao diện người dùng có vẻ thực sự tốt, có vẻ như hỗ trợ HTTP. Worth một cái nhìn trong quan điểm của tôi :) –

0

Cách dễ nhất của tập tin tải lên trong java là GOJFileUpload.jar thư viện

Dưới đây là thư viện gojfileupload hướng dẫn:

GOJFileUpload

Họ đưa ra hai phương pháp

  • UploadFile (String filepath , ArrayList imagenames, HttpRequest request)
  • UploadFile (Chuỗi filepath , ArrayList dataname, ArrayList imagenames, HttpYêu cầu tối thiểu)

Chúng sẽ trả lại cho bạn HashMap tên tệp mà bạn đã tải lên sau khi tải lên tại thư mục đích đã cho.