2016-05-04 4 views
1

Ich bin ein Anfänger von NanoHTTPD, lernte ich die Dokumente NanoHttpd save uploaded files und https://github.com/romsahel/simplewebserverWie kann ich den Code ändern, um mehrere Dateien mit NanoHTTPD in Android hochzuladen?

Der folgende Code eine einzelne Datei hochladen Handy via WiFi auf Android.

Jetzt hoffe ich, mehrere Dateien auf Android-Handy hochladen, wie kann ich den folgenden Code ändern, um das zu tun? Vielen Dank!

package com.wade.webserver; 

import android.util.Log; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 



public class MyServer extends NanoHTTPD { 
    private final static int PORT = 8189; 
    private String rootDir = null; 

    @SuppressWarnings("serial") 
    public static final List<String> INDEX_FILE_NAMES = new ArrayList<String>() { 
     { 
      add("index.html"); 
      add("index.htm"); 
     } 
    }; 


    public MyServer() throws IOException { 
     super(PORT); 
     File f; 
     f = new File("/storage/sdcard0/www"); 
     if (f.canWrite()) { 
      rootDir = "/storage/sdcard0/www"; 
      System.out.println("rootDir = " + rootDir); 
     } 
     else { 
      f = new File("/storage/sdcard1/www"); 
      if (f.canWrite()) { 
       rootDir = "/storage/sdcard1/www"; 
       System.out.println("rootDir = " + rootDir); 
      } 
      else { 
       rootDir = "/storage/sdcard0"; 
       System.out.println("set rootDir default " + rootDir); 
      } 
     } 
     start(NanoHTTPD.SOCKET_READ_TIMEOUT); 
    } 



    @Override 
    public Response serve(IHTTPSession session) 
    { 
     Map<String, String> header = session.getHeaders(); 
     Map<String, String> parms = session.getParms(); 
     Method method = session.getMethod(); 
     String uri = session.getUri(); 

     System.out.println(method + " '" + uri + "' "); 

     if (Method.POST.equals(method) || Method.PUT.equals(method)) 
      handlePost(session, parms); 

     File file = new File(rootDir + uri); 
     if (!file.exists()) { 
      return getNotFoundResponse(); 
     } 

     if (file.isDirectory()) 
      return listDirectory(file, header, uri); 
     else 
      return downloadFile(file); 
    } 

    private Response handlePost(IHTTPSession session, Map<String, String> parms) 
    { 
     Map<String, String> files = new HashMap<>(); 
     try 
     { 
      session.parseBody(files); 

      final File src = new File(files.get("filename")); 
//   final File dst = new File(rootDir, parms.get("filename")); 

      //final File mydst = new File(parms.get("filename")); 

      String myString=parms.get("filename"); 
      String fileName = myString.substring(myString.lastIndexOf("\\")+1); 

      String s = "/storage/sdcard0/www/"+fileName; 
      final File dst = new File(s); 

      //Files.copy(src.toPath(), dst.toPath(), StandardCopyOption.REPLACE_EXISTING); 

      try { 
       copy(src, dst); 
      }catch (Exception e){ 
       Log.e("CW","Error"); 
       e.printStackTrace(); 
      } 

      System.out.println(src.getAbsolutePath() + ": uploaded to: " + dst.getAbsolutePath());   

      return newFixedLengthResponse(Response.Status.OK, NanoHTTPD.MIME_PLAINTEXT, "ok i am "); 
     } catch (IOException ex) 
     { 

     } catch (ResponseException ex) 
     { 
     } 
     return getNotFoundResponse(); 
    } 



    public void copy(File src, File dst) throws IOException { 
     InputStream in = new FileInputStream(src); 
     OutputStream out = new FileOutputStream(dst); 

     // Transfer bytes from in to out 
     byte[] buf = new byte[1024]; 
     int len; 
     while ((len = in.read(buf)) > 0) { 
      out.write(buf, 0, len); 
     } 
     in.close(); 
     out.close();  
    } 


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

    private Response listDirectory(File file, Map<String, String> header, String uri) 
    { 
     String htmlCode = "<li><a href=\"http://%s\">%s</a></li>"; 
     StringBuilder message = new StringBuilder("<ul>"); 
     for (File f : file.listFiles()) 
      message.append(String.format(htmlCode, header.get("host") + uri + f.getName(), f.getName())); 
     message.append("</ul>"); 

     message.append("<form method=\"post\" enctype=\"multipart/form-data\">\n" 
       + " <input type=\"file\" name=\"filename\" />\n" 
       + " <input type=\"submit\" value=\"Send\" />\n" 
       + "</form>"); 

     return mynewFixedLengthResponse(Response.Status.OK, NanoHTTPD.MIME_HTML, message.toString()); 
    } 

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

    protected Response getNotFoundResponse() 
    { 
     return newFixedLengthResponse(Response.Status.NOT_FOUND, NanoHTTPD.MIME_PLAINTEXT, "Error 404, file not found."); 
    } 

} 
+0

Irgendwelche Ideen mir Feind? – HelloCW

+0

Ich bin ein bisschen verwirrt - denken Sie darüber nach, 'final File src = neue Datei (files.get (" filename "));' wo 'src' ist ein Verzeichnis? ODER wollen Sie die files = new HashMap <>(); 'mit mehreren Einträgen, die die Dateinamen der hochzuladenden Dateien angeben, haben? – ishmaelMakitla

Antwort

0

Ich habe es wie folgt aus:

public Response serve(IHTTPSession session) { 
if (uri.toLowerCase().contains("add_file".toLowerCase())) { 

     Method method = session.getMethod(); 
     if (Method.PUT.equals(method) || Method.POST.equals(method)) { 
      try { 
       Map<String, String> files = new HashMap<>(); 
       session.parseBody(files); 
      } catch (IOException ioe) { 
       return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, NanoHTTPD.MIME_PLAINTEXT, "SERVER INTERNAL ERROR: IOException: " + ioe.getMessage()); 
      } catch (ResponseException re) { 
       return newFixedLengthResponse(re.getStatus(), NanoHTTPD.MIME_PLAINTEXT, re.getMessage()); 
      } 
     } 
     HelloServer.LOGCONSOLE.info(method + " '" + uri + "' "); 
     String msg = upload(session); 
return newFixedLengthResponse(msg); 
    } 
public upload(IHTTPSession session){ 
Map<String, String> parms = session.getParms(); 
// recuperate file names 
String file1 = parms.get("input_file"); 
String file2 = parms.get("filename1"); 
String file3 = parms.get("myFile2"); 

// you must put numbers if file number more than 1 

// source file is located in the temporary directory 
// you can modify your temp direcory by eiditing NanoHTTPD.saveTmpFile 
... 
return String ... ; 
Verwandte Themen