2017-02-15 255 views
9

我在我的Android應用程序中使用NanoHTTPD作爲Web服務器。如何在Android中使用NanoHTTPD一次下載兩個或多個文件?

我將兩個文件名從客戶端瀏覽器傳遞到NanoHTTPD服務器,我希望一次下載這兩個文件,但以下代碼只下載file1,並且不下載file2。

如何一次下載兩個或多個文件?

public class MyWebServer extends NanoHTTPD 
{ 

    private final String rootDir; 

    public MyWebServer(int port, String rootDir) 
    { 
     super("192.168.1.4", port); 
     this.rootDir = rootDir; 
    } 

    @Override 
    public Response serve(IHTTPSession session) 
    {  
     Map<String, String> parms = session.getParms(); 

     String filename1=GetFilename(parms); 
     String filename2=GetFilename(parms); 

     File file1 = new File(rootDir + filename1); 
     File file2 = new File(rootDir + filename2); 

     return downloadFile(file1); 
     return downloadFile(file2); 
    } 


    private Response downloadFile(File file) 
    { 
     FileInputStream fis = null; 
     try 
     { 
      fis = new FileInputStream(file); 
     } catch (FileNotFoundException ex) 
     { 
      Logger.getLogger(MyWebServer.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return newFixedLengthResponse(Response.Status.OK, "application/octet-stream", fis, file.getTotalSpace()); 
    } 



    @Override 
    public Response newFixedLengthResponse(IStatus status, String mimeType, String message) 
    { 
     Response response = super.newFixedLengthResponse(status, mimeType, message); 
     response.addHeader("Accept-Ranges", "bytes"); 
     return response; 
    } 


} 
+0

通話2次MyWebServer的與文件名1和文件名2個 – Pavya

+0

謝謝!但我希望1次調用MyWebServer並下載兩個文件 – HelloCW

+2

return downloadFile(file1);因爲這個返回downloadFile(file2);它永遠不會叫 – Pavya

回答

-1

在Java中,當你想要一個函數返回多個值,你必須在你返回一個對象中嵌入這些值。 所以,你需要定義一個類(例如:ReturnDownlowds),這可能有兩個對象:

public class ReturnDownlowds { 
    private File downloadFile1; 
    private File downloadFile2; 

//添加其他字段,構造函數和訪問器

}

而且在您的響應服務器方法中,您需要調用此類示例:

return new ReturnDownlowds(downloadFile1, downloadFile2) ; 

我希望這會有一點幫助。

+0

謝謝!但Web服務器是無狀態的! – HelloCW

3

NanoHTTPD構造函數在MyWebServer構造函數中調用super(..)時會創建一個異步任務。

public NanoHTTPD(String hostname, int port) { 
     this.hostname = hostname; 
     this.myPort = port; 
     setTempFileManagerFactory(new DefaultTempFileManagerFactory()); 
     setAsyncRunner(new DefaultAsyncRunner()); 

     // creates a default handler that redirects to deprecated serve(); 
     this.httpHandler = new IHandler<IHTTPSession, Response>() { 

      @Override 
      public Response handle(IHTTPSession input) { 
       return NanoHTTPD.this.serve(input); 
      } 
     }; 
    } 

所以答案必須是每個操作都有一個downloadFile()。也就是說你應該撥打new MyWebServer()開始每個下載任務。

@Override 
    public Response serve(IHTTPSession session) 
    {  
     Map<String, String> parms = session.getParms(); 

     String filename=GetFilename(parms); 

     File file = new File(rootDir + filename); 

     return downloadFile(file); 
    } 

編輯:

通過使用MyWebServer的類的實例2,U可以聽爲每2個PARAMS客戶端請求。 (我沒有嘗試這個,但它必須工作,我建議你應該在客戶端發送多個請求,並在服務器端發送一個web服務器實例)。

public class MyWebServer extends NanoHTTPD 
{ 

    private final String rootDir; 
    private final int param_type = 1; //default 1 

    public MyWebServer(int port, String rootDir, int param) 
    { 
     super("192.168.1.4", port); 
     this.rootDir = rootDir; 
     this.param_type = param; 
    } 

    @Override 
    public Response serve(IHTTPSession session) 
    {  
     Map<String, String> parms = session.getParms(); 
     File file; 

     if (param_type == 1){ 
      String filename=parms.get("param1"); 
      file = new File(rootDir + filename); 
     }else if(param_type == 2){ 
      String filename=parms.get("param2"); 
      file = new File(rootDir + filename); 
     } 


     return downloadFile(file); 
    } 


    private Response downloadFile(File file) 
    { 
     FileInputStream fis = null; 
     try 
     { 
      fis = new FileInputStream(file); 
     } catch (FileNotFoundException ex) 
     { 
      Logger.getLogger(MyWebServer.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return newFixedLengthResponse(Response.Status.OK, "application/octet-stream", fis, file.getTotalSpace()); 
    } 



    @Override 
    public Response newFixedLengthResponse(IStatus status, String mimeType, String message) 
    { 
     Response response = super.newFixedLengthResponse(status, mimeType, message); 
     response.addHeader("Accept-Ranges", "bytes"); 
     return response; 
    } 


} 

在MainActivity.java

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     MyWebServer server1 = new MyWebServer(port, rootDir, 1); 
     MyWebServer server2 = new MyWebServer(port, rootDir, 2); 

     server1.start(); 
     server2.start(); 

    } 
+0

謝謝!通常,我創建一個MyWebServer實例來偵聽客戶端請求,現在客戶端傳遞兩個文件名並請求下載。我如何創建新的MyWebserver()將兩個文件發送到客戶端? – HelloCW

+0

你如何提出客戶端請求? – uguboz

+0

我使用POST方法發送兩個文件名到服務器端 – HelloCW

相關問題