2012-06-07 100 views
0

我在編寫代碼以從FTP URL中讀取文件,以解析它並將數據存儲在Google App Engine的數據存儲中。在閱讀託管在我自己的Web服務器上的測試文件時,我能夠使代碼正常工作,但是當我嘗試讀取數據文件時,我需要獲取FileNotFoundException。從Google App Engine中的FTP URL中讀取文件FileNotFoundException

我可以在瀏覽器中使用相同的FTP URL來下載文件,並可以匿名連接到FileZilla中的FTP URL,因此訪問不應該是一個問題,並且文件肯定存在。這是一個非常大的文件,但我試圖從相同的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;

應用程序可以使用HTTP(普通)或HTTPS(安全)來獲取URL。該URL指定要使用的方案:http:// ...或https:// ...

要獲取的URL可以使用以下範圍中的任何端口號:80-90,440-450, 1024-65535。如果端口未在URL中提及,則該端口由該方案暗示:http:// ...是端口80,https:// ...是端口443.

+0

這很有道理..感謝您指出這一點,不知道我在閱讀該頁面時是如何錯過的。 – Trent

相關問題