2009-10-22 36 views
8

Tôi hiện đang tìm kiếm một số tệp tải lên bằng cách sử dụng Khuôn mặt máy chủ Java. Tôi đã tìm thấy this great introduction cho nó bằng RichFaces. Tuy nhiên, tôi có một số khó khăn trong việc hiểu quy trình ở đây.Tải lên tệp bằng RichFaces

Đầu tiên người dùng chọn tệp và nếu tải lên tức thì được đặt thành true thì tệp được xử lý bằng ajax, cho đến nay rất tốt. Khi nói đến tuy nhiên bước tiếp theo, người nghe trên Bean phía sau confuses me:

public void listener(UploadEvent event) throws Exception{ 
    UploadItem item = event.getUploadItem(); 

    File f = item.getFile(); 

    System.out.println(f.getAbsolutePath()); 
} 

Đường dẫn tuyệt đối là vào một thư mục tạm thời trên máy tính của tôi, chắc chắn tôi hiểu rằng, nhưng làm thế nào bạn có thể làm cho tệp có sẵn cho webbapplication? Ứng dụng của tôi được triển khai dưới dạng tệp WAR. Có thể tải nó lên WAR không? Có thể âm thanh ngu ngốc hay như vậy, nhưng nó thực sự có thể có ích.

Tôi hoàn toàn biết rằng tôi có thể đổi tên tệp để sao chép tệp sang vị trí mới, nhưng đó có phải là cách để đi không?

Trả lời

5

Viết nội dung vào thư mục WAR của bạn (giả sử WAR thậm chí bị phát nổ dưới dạng thư mục), nói chung là một ý tưởng tồi (vì cùng lý do lưu trữ dữ liệu trong thư mục ứng dụng của bạn thường là một ý tưởng tồi).

Bạn có thể muốn nó kết thúc trong một cửa hàng kiên trì, thường là một cơ sở dữ liệu. Chính xác cách bạn quản lý tùy thuộc vào bạn - cho dù bạn sử dụng hệ thống tệp và lưu trữ tham chiếu trong cơ sở dữ liệu hoặc lưu trữ BLOB trong cơ sở dữ liệu trực tiếp và liệu bạn có sử dụng JDBC hoặc JPA hoặc Hibernate, v.v.

Danh sách các tệp đã tải lên sau đó có thể được đọc từ cơ sở dữ liệu bằng cách làm mới bảng điều khiển chứa chúng bằng cách sử dụng một cái gì đó như <a4j:support event="onuploadcomplete" reRender="info" />.

Một tệp tải xuống servlet (nếu RichFaces không có) là khá dễ viết.

+0

Như tôi đã nghĩ, cảm ơn đã xóa nó. Đoán tôi sẽ phải xem xét việc tạo ra một servlet tải về. –

+0

Bạn đã bao giờ tìm ra cách tạo servlet tải xuống, Filip chưa? Tôi đã chơi xung quanh với thành phần fileUpload và tôi không thể cho cuộc sống của tôi tìm ra nơi một tập tin đi sau khi tôi tải nó lên. – MattSayar

5

Không chắc chắn có bao nhiêu trợ giúp này (và có thể là quá muộn!), Nhưng đây là mã tôi sử dụng ở phía máy chủ, tương đương với người nghe của bạn.

public String uploadFile(UploadEvent event) { 
    UploadItem item = event.getUploadItem(); 

    String name = "unnamed_attachment"; 
    byte[] data = item.getData(); 

    try { 
     name = FilenameUtils.getName(item.getFileName()); 
     data = FileUtils.readFileToByteArray(item.getFile()); 
     logger.info("data.length = " + data.length); 
     UploadDetails details = new UploadDetails(); // This is a javabean that gets persisted to database (actually a ejb3 entity bean, but thats irrelevant) 

     details.setBytes(data); 
     details.setResume(true); 
     // Save to database here 

    } catch (Exception e) { 
     FaceletsUtil.addSystemErrorMessage(); 
     logger.error(e, e); 
    } 
    return null; 
} 

Câu hỏi lớn còn lại là bạn nói "cách bạn tạo tệp sẵn có cho webbapplication?". Mảng byte có sẵn ngay lập tức. Nếu bạn muốn tải xuống lại tệp, bạn có thể cung cấp tệp đó dưới dạng liên kết đến phương thức trong phiên JSF/xem bean như: