Как разрешить загрузку файлов с WebView в Какао? - PullRequest
7 голосов
/ 02 октября 2011

В WebView есть метод с именем

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

Но там почти 0 документов и подробностей.Внутри я отображаю диалог открытия файла и получаю имя выбранного файла.

Как это

- (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]; 
    }

}

Но тогда?

Что мне делать?На веб-сайте это показывает, что я выбрал файл, но когда вы нажимаете на кнопку «загрузить», веб-сайт просто возвращает ошибку, например, если файл не загружен.Должен ли я написать код, который обрабатывает загрузку файла или что?

Я в некотором роде потерян ...

Редактировать:

На самом деле у меня все получилось ... Просто изменив код отсюда: Какаоwebkit: как получить загрузку файлов / доступ к файловой системе в webkit , так как некоторая часть устарела

- (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];
    }

}

Наслаждайтесь!

Ответы [ 2 ]

8 голосов
/ 04 октября 2011

Я последовал комментарию Питера Хоси и ничего себе, мой код теперь короткий и работает так же

- (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];
    }

}
2 голосов
/ 03 октября 2011

Есть несколько способов улучшить ваш код:

  • Чтобы перебрать массив, используйте fast enumeration вместо цикла index. Это и быстрее, и легче для чтения. Единственный раз, когда вы должны использовать цикл индекса, это когда вам действительно нужны индексы, а это не такая ситуация.
  • Вам не нужен первый цикл вообще. Отправьте массив URL-адресов сообщение valueForKey: с ключом @"relativePath". Массив запросит у каждого объекта (каждого URL) его relativePath, соберет массив всех результатов и вернет его вам. Код для этого однострочный.
  • Вам также не нужен второй цикл. Протокол WebOpenPanelResultListener добавил chooseFilenames: в 10.6, поэтому теперь вы можете просто отправить это сообщение один раз, передав ему весь массив.
...