2011-10-02 15 views
7

WebView có một phương pháp gọi làLàm cách nào để cho phép tải lên tệp bằng WebView trong Cocoa?

- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id <WebOpenPanelResultListener>)resultListener 

Nhưng hầu như 0 doc và chi tiết về nó. Bên trong tôi hiển thị một hộp thoại mở tập tin và nhận được tên tập tin được chọn.

Như thế này

- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id <WebOpenPanelResultListener>)resultListener 
{  
    NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 

    [openDlg setCanChooseFiles:YES]; 

    [openDlg setCanChooseDirectories:NO]; 

    // process the files. 
    if ([openDlg runModal] == NSOKButton) 
    { 
     NSString* fileString = [[openDlg URL]absoluteString]; 
     [resultListener chooseFilename:fileString]; 
    } 

} 

Nhưng sau đó?

Tôi nên làm gì? Trên trang web, nó cho thấy rằng tôi đã chọn một tệp nhưng khi bạn nhấp vào tải lên, trang web chỉ trả lại lỗi, như thể không có tệp nào được tải lên. Tôi có nên viết mã xử lý tệp tải lên hay không?

Tôi kinda mất ...

Edit:

Trong thực tế, tôi đã nhận nó làm việc .... Bởi chỉ cần thay đổi mã từ đây: Cocoa webkit: how to get file upload/file system access in webkit một chút, như một số phần đã bị phản đối

- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id <WebOpenPanelResultListener>)resultListener 
{  
    // Create the File Open Dialog class. 
    NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 

    // Enable the selection of files in the dialog. 
    [openDlg setCanChooseFiles:YES]; 

    // Enable the selection of directories in the dialog. 
    [openDlg setCanChooseDirectories:NO]; 

    if ([openDlg runModal] == NSOKButton) 
    { 
     NSArray* URLs = [openDlg URLs]; 
     NSMutableArray *files = [[NSMutableArray alloc]init]; 
     for (int i = 0; i <[URLs count]; i++) { 
      NSString *filename = [[URLs objectAtIndex:i]relativePath]; 
      [files addObject:filename]; 
     } 

     for(int i = 0; i < [files count]; i++) 
     { 
      NSString* fileName = [files objectAtIndex:i]; 
      [resultListener chooseFilename:fileName]; 
     } 
     [files release]; 
    } 

} 

Tận hưởng!

+0

gì là ngôn ngữ mà bạn đang sử dụng? –

+0

Mục tiêu-c, nhưng bây giờ tôi đã làm việc – Dimillian

+0

rồi xóa câu hỏi của bạn .. –

Trả lời

8

Tôi đi theo Peter Hosey bình luận và wow, mã của tôi bây giờ là ngắn và hoạt động giống

- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id <WebOpenPanelResultListener>)resultListener 
{  
    // Create the File Open Dialog class. 
    NSOpenPanel* openDlg = [NSOpenPanel openPanel]; 

    // Enable the selection of files in the dialog. 
    [openDlg setCanChooseFiles:YES]; 

    // Enable the selection of directories in the dialog. 
    [openDlg setCanChooseDirectories:NO]; 

    if ([openDlg runModal] == NSOKButton) 
    { 
     NSArray* files = [[openDlg URLs]valueForKey:@"relativePath"]; 
     [resultListener chooseFilenames:files]; 
    } 

} 
+0

runOpenPanelForFileButtonWithResultListener, phương pháp này không được gọi cho tôi – jkk

+0

@jkk và bất cứ ai khác với vấn đề này, bạn cần phải kết nối chế độ xem cho 'UIDelegate', nếu không hàm sẽ không được gọi. –

2

Có một vài cách mã của bạn có thể được cải thiện:

  • Để lặp qua một mảng, sử dụng fast enumeration thay vì một vòng lặp chỉ mục. Đó là cả hai nhanh hơn và dễ dàng hơn để đọc. Thời gian duy nhất bạn nên sử dụng một vòng lặp chỉ mục là khi bạn thực sự cần các chỉ mục, và đây không phải là một tình huống như vậy.
  • Bạn không cần vòng lặp đầu tiên. Gửi mảng URL thông báo valueForKey:, với @"relativePath" cho khóa. Mảng sẽ hỏi mỗi đối tượng (mỗi URL) cho relativePath của nó, thu thập một mảng của tất cả các kết quả, và trả lại cho bạn. Mã cho điều này là một lớp lót.
  • Bạn cũng không cần vòng lặp thứ hai. Giao thức WebOpenPanelResultListener được thêm chooseFilenames: trong 10.6, vì vậy bây giờ bạn có thể chỉ cần gửi thông báo đó, một lần, chuyển toàn bộ mảng tới đó.
+0

Cảm ơn rất nhiều, tôi thực sự cần phải học cách sử dụng sức mạnh thực sự của Objective-C – Dimillian