2017-02-15 253 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

相关问题