java
  • grails
  • file-upload
  • groovy
  • 2010-09-14 4268 views 6 likes 
    6

    Tôi có GSP này:Làm thế nào để lặp qua tải lên tập tin trong Grails

    <g:uploadForm name="myForm" action='save'>  
        <input type='file' name='documentFile' value=''/> 
        <input type='file' name='documentFile' value=''/> 
        <input type='file' name='documentFile' value=''/> 
        <input type='file' name='documentFile' value=''/> 
        <input type='submit' value='Submit'/> 
    </g:uploadForm> 
    

    Nhưng khi tôi cố gắng để xem kết quả trong điều khiển bằng cách gõ:

    render(params); 
    return true; 
    

    tôi có kết quả này:

    "documentFile":[email protected]4dcf95 
    

    Làm cách nào để đọc từng tệp đang được tải lên? Tôi có thể nhận được thông tin sau không?

    documentFile:[File,null,File,null] // (if the 2nd and the 4th are not being used) 
    

    ps: Tôi đang sử dụng grails 1.2.2

    +0

    Bạn có số lượng tệp thay đổi trong biểu mẫu của mình hay không? Nếu nó biến, tôi sẽ cập nhật câu trả lời của tôi cho phù hợp. –

    +0

    nó biến. Tôi đã thêm số vào cuối tên ... nhưng nó vẫn còn lạ vì khi bạn gõ nhiều lần nó sẽ tạo ra mảng "cái gì đó" trong params. – nightingale2k1

    +0

    Vâng, tôi đã xem qua API Grails và không thể tìm thấy một phương thức truy xuất đối tượng File [] dựa trên các đầu vào của tệp. Servlet API cung cấp phương thức để lấy mảng String [], nhưng tôi đã không xem xét nguồn của nó để xem nó như thế nào. Có lẽ nó có thể được thực hiện với một số công việc thủ công trên yêu cầu HTTP, nhưng đó có thể là quá nhiều công việc. Sử dụng Grails ''request.fileNames' có lẽ là một tương đương hợp lý. –

    Trả lời

    6

    tiên, bạn sẽ cần phải cung cấp tên duy nhất cho mỗi đầu vào tập tin của bạn:

    <g:uploadForm name="myForm" action="save"> 
        <input type="file" name="documentFile1" value=""/> 
        <input type="file" name="documentFile2" value=""/> 
        ... 
    </g:uploadForm> 
    

    Sau đó, trong điều khiển của bạn, bạn có thể sử dụng:

    // access each file by name 
    File file = request.getFile('documentFile1') 
    
    // or iterate through them 
    request.fileNames.each { 
        File file = request.getFile(it) 
    } 
    

    Tôi chắc chắn rằng thuộc tính name của bạn phải là duy nhất. Tôi không thể tìm thấy bất kỳ thứ gì trong API cho phép bạn nhận được một loạt tệp được tải lên với cùng một đầu vào name.

    Tài liệu tham khảo:

    +0

    Một năm sau đó và giải pháp này vẫn hữu ích. Cảm ơn Rob! – Joseph

    +0

    Vì vậy, tôi không thể sử dụng ''? –

    +0

    Tôi không tin như vậy. Ý tôi là, bạn có thể, nhưng nó sẽ không hoạt động giống như PHP. Bạn vẫn có thể lặp qua 'fileNames' để hoàn thành về cơ bản cùng một thứ. –

    6

    Bắt đầu với grails 1.2 (mùa xuân 3.0), bạn có thể truy cập vào nhiều tập tin từ đầu vào có cùng tên (hoặc sử dụng HTML5 multiple thuộc tính) với thuộc tính multiFileMap của đối tượng request của bộ điều khiển (khi yêu cầu là bài đăng biểu mẫu nhiều phần, đối tượng request sẽ là một lập trường của MultipartRequest). Vì vậy, bạn có thể truy cập vào danh sách các MultipartFile đối tượng cho một tên cụ thể đầu vào (tức là documentFile) như thế này:

    def save = { 
        List<MultipartFile> files = request.multiFileMap.documentFile 
        int count = files.findAll { !it.empty }.size 
        render "uploaded $count files" 
    } 
    

    Hoặc truy cập tất cả các đối tượng MultipartFile từ tất cả các nguyên liệu đầu vào như thế này:

    def save = { 
        List<MultipartFile> files = request.multiFileMap.collect { it.value }.flatten() 
        int count = files.findAll { !it.empty }.size 
        render "uploaded $count files" 
    } 
    

    Sửa 2013-02-08: Brian Adams yêu cầu:

    Trong trường hợp trên, tôi có thể truy cập tất cả Mul Các đối tượng tipartFile từ tất cả các đầu vào trên trang web của tôi. Nhưng tôi muốn nhận tệp từ bất kỳ đầu vào nào là nhiều. Ví dụ: Tôi có tên đầu vào là: "uploadFiles" và tôi muốn nhận tất cả các tệp từ thẻ đầu vào này bất kỳ. Bạn có thể giúp tôi được không?

    Brian, tôi nghĩ điều bạn muốn là phiên bản đầu tiên ở trên.Nếu tệp nhập của bạn có tên là "uploadFiles", thì bạn có thể truy cập tệp đó từ multiFileMap bằng cách sử dụng khóa "uploadFiles":

    def save = { 
        List<MultipartFile> files = request.multiFileMap.uploadFiles 
        int count = files.findAll { !it.empty }.size 
        render "uploaded $count files" 
    } 
    
    Các vấn đề liên quan