2012-06-07 5 views
0

Я пишу код для чтения файла с URL-адреса FTP, чтобы проанализировать его и сохранить данные в хранилище данных Google App Engine. Я могу заставить код работать нормально при чтении тестовых файлов, размещенных на моем собственном веб-сервере, однако, когда я пытаюсь прочитать файл данных, который мне нужен, я получаю FileNotFoundException.Чтение файла с FTP-URL в Google App Engine, FileNotFoundException

Я могу использовать один и тот же FTP-адрес в браузере для загрузки файла и могу анонимно подключаться к FTP-адресу в FileZilla, поэтому доступ не должен быть проблемой, и файл определенно существует. Это довольно большой файл, но я тоже пытался захватить файлы меньшего размера с одного и того же FTP-сервера.

Вот код, у меня есть на данный момент:

public void doGet(HttpServletRequest req, 
     HttpServletResponse resp) throws IOException, ServletException { 

    // works with a URL to my own server & a test.zip, but not this one 
    final URL url = new URL(
     "ftp://gisftp.metc.state.mn.us/google_transit.zip"); 

    // without the privileged action, I get an AccessControlException 
    ZipInputStream zin = AccessController.doPrivileged(
     new PrivilegedAction<ZipInputStream>() { 
      public ZipInputStream run() { 
       return getZipStream(url); 
      } 
     } 
    ); 

    ZipEntry zipentry = zin.getNextEntry(); 

    // processing files here 

    zin.close(); 
} 

// but using the privileged method, we get a FileNotFoundException 
public ZipInputStream getZipStream(URL url) { 
    ZipInputStream zipin = null; 
    try { 
     zipin = new ZipInputStream(url.openStream()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return zipin; 
} 

Сначала я получаю AccessControlException, но с использованием PrivilegedAction, чтобы открыть поток, кажется, исправить.

У меня нет доступа к серверу, на котором хранится файл, поэтому он ничего не может изменить.

ответ

1

Я думаю, что есть ограничение на порты, к которым можно подключиться из App Engine и FTP (21), нет в списке, это может вызвать проблему. From the URL Fetch documentation;

Приложение может получать URL-адрес, используя HTTP (обычный) или HTTPS (безопасный). URL-адрес указывает схему использования: http: // ... или https: // ...

URL-адрес, который вы хотите получить, может использовать любой номер порта в следующих диапазонах: 80-90, 440-450, 1024-65535. Если порт не указан в URL-адресе, порт подразумевается по схеме: http: // ... - порт 80, https: // ... - это порт 443.

+0

Это имеет смысл .. .thanks для того, чтобы указать на это, не знаю, как я пропустил это, когда прочитал эту страницу. – Trent

Смежные вопросы