2014-11-03 15 views
6

Tôi muốn chương trình của mình có cửa sổ bật lên lưu dưới dạng trước khi bắt đầu tải xuống tệp, tuy nhiên khi tôi chạy servlet, nó sẽ tự động bắt đầu tải xuống tệp. Tôi đang thiếu gì ở đây?Có vấn đề trong khi tải xuống tệp bằng cách sử dụng bố cục nội dung

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    ServletOutputStream outputStream = response.getOutputStream(); 
    FileInputStream fis=new FileInputStream("E:/sound.mp3"); 
    response.setContentLength(fis.available()); 
    response.setContentType("audio/basic"); 
    response.addHeader("content-disposition", "attachment;filename=abc.mp3"); 
    while(true){ 
     int read = fis.read(); 
     if(read==-1)break; 
     outputStream.write(read); 
    } 
    fis.close();   
} 
+0

Tôi tin rằng điều này ở phía máy chủ. Bạn đang cố gắng truyền bá sự kiện máy chủ đến phía máy khách. – christopher

+0

Hãy xem: http://stackoverflow.com/questions/3802510/force-to-open-save-as-popup-open-at-text-link-click-for-pdf-in-html và http: //stackoverflow.com/questions/2226192/generate-some-xml-in-javascript-prompt-user-to-save-it Kính trọng –

+1

@ DaniloMuñoz: AS fas như tôi có thể thấy avobe hai kịch bản là hình thức khác nhau của tôi..nhưng cảm ơn vì lo ngại –

Trả lời

6

Chương trình của bạn KHÔNG phải là máy tính để bàn/độc lập, vì đây là một servlet đang chạy trên máy chủ. Khi bạn chạy nó trong Eclipse bằng cách nhấn chuột phải và run as ->run on server, Eclipse thực sự mở một trang web để hiển thị các kết quả. Do đó, chương trình của bạn bây giờ là một ứng dụng Web và Eclipse (hoặc trang nó mở ra) là ứng dụng khách. Khách hàng đang lưu thông tin bạn đã gửi, KHÔNG phải là chương trình của bạn. Hiểu rồi?

Tiêu đề content-disposition chỉ có để đề xuất tên tệp tải xuống. Cài đặt trình duyệt xác định xem nó có mở một cửa sổ Lưu dưới dạng hay không. Bạn không thể kiểm soát điều đó.

Ví dụ: trong Google Chrome, trong Setting/Advanced Setting/Downloads, có tùy chọn Ask where to save each file before downloading. Chỉ khi tùy chọn này được chọn, nó sẽ mở hộp thoại bạn muốn. Nếu không, nó sẽ lưu nó ở một vị trí mặc định (cũng được xác định trong cài đặt trình duyệt). Các tùy chọn tương tự tồn tại cho tất cả các trình duyệt.

hãy cũng lưu ý rằng, tùy thuộc vào content-type tiêu đề, trình duyệt sẽ cố gắng hiển thị nội dung, và không tải nó. Ví dụ, trình duyệt sẽ cố gắng hiển thị văn bản và html. Nhưng sau đó bạn có thể lực tải về bằng cách thiết lập các tiêu đề để một kiểu không thể hiển thị:

response.setContentType("application/octet-stream");

Trong trường hợp bạn không muốn tạo ra một ứng dụng Web: Kể từ khi chương trình của bạn chạy trên một máy chủ , nó chỉ đơn giản là gửi thông tin và được thực hiện. Đây là chương trình khách hàng, người quyết định phải làm gì với nó. Trong trường hợp hiện tại của bạn, client là một trình duyệt (hoặc Eclipse đang mở một trang trình duyệt). Các tiêu đề như tiêu đề content-disposition nhằm vào trình duyệt. Nếu bạn muốn tạo ứng dụng khách của riêng mình (ứng dụng khách Swing, ứng dụng Android, ứng dụng iPhone) KHÔNG phải là trình duyệt, thì ứng dụng khách sẽ nhận được thông tin từ máy chủ và quyết định làm gì với nó (hiển thị hoặc lưu nó trong bất kỳ), thậm chí bỏ qua các tiêu đề HTTP.

+0

Cảm ơn rất nhiều. Bạn giải thích nó tốt. –

2

Hãy thử tìm kiếm ở đây: http://www.java2s.com/Code/Java/Swing-JFC/DemonstrationofFiledialogboxes.htm

đưa ra tuyên bố chính trong mã của họ và đưa run(new FileChooserTest(), 250, 110); trong mã của riêng bạn. Nếu tôi đã làm điều đó, tôi sẽ tạo một int có tên là saveStatus và 3 kết quả bằng 0, 1 và 2 có tên là waiting, savecancel. Sau đó, tôi sẽ làm một vòng lặp trong khi lập trình khác của bạn để xem nếu saveStatus bằng waiting để tạm dừng chương trình của bạn (nhưng không phải là hộp thoại). Sau đó, tôi sẽ thực hiện một câu lệnh if để xem liệu saveStatus có bằng save hay không. Nếu có, hãy tải xuống và nếu không, thì đừng. Đơn giản như thế.

2

Sự cố của bạn là loại Mime. Một số loại (đặc biệt là những loại mà một trình xử lý cụ thể đã biết) sẽ được tải xuống trực tiếp bởi hầu hết các trình duyệt. Nó giúp một chút để sử dụng ứng dụng/nhị phân, nhưng thậm chí sau đó một số trình duyệt có thể được cấu hình để tải xuống hoặc giải thích phần mở rộng tên tệp trong trình xử lý bố trí.

Tôi nghĩ rằng hầu hết các giải pháp đều sử dụng javascript trên trang trước liên kết tải xuống.

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