2014-07-21 7 views
6

Bir Java Desktop Env. (Hiçbir Android)NanoHTTPD: html formunu kullanarak bir dosya yükleyin (POST)

Her şey iyi çalışıyor ... ama dosya yükleme (PUT formlarla desteklenmez) İşte

benim HTML kodu POST yöntemini kullanıyor:

<form method="post" enctype="multipart/form-data"> 
    choose a file<br> 
    <input name="file" type="file" size="50" maxlength="100000""> 
    <button type="submit">upload</button> 
</form> 

Ve burada

public Response serve(IHTTPSession session) { 
    if (session.getMethod() == Method.POST) { 
     Map<String, String> files = new HashMap<String, String>(); 
     session.parseBody(files); 
     //this prints {file=C:\path-to-java-tmp-files\NanoHTTPD-4635244586997909485} 
     //the number is always different 
     System.out.println(files.toString()); 
    } else { 
     //page containing the index.html including the form 
     return page; 
    } 
} 

Ve

sorun: temp-dosya yok burada benim sunucu Methode olduğunu. Sonunda farklı bir "sayı" olan başka bir geçici dosya var ve bu doğru dosya gibi görünüyor, çünkü içerik yüklenen dosyanın içeriği ile aynı. Peki doğru temp-dosya adı nasıl alınır?

Başka bir problem ise: İçerik pic veya bir ikili ise

-----------------------------115801144322347 
Content-Disposition: form-data; name="file"; filename="filename.txt" 
Content-Type: application/octet-stream 

-->content of the uploaded file 


-----------------------------115801144322347-- 

bu bir sorundur: geçici dosya deliği SONRASI içeriğe sahiptir.

Görünüşe göre NanoHTTPD bir POST isteğiyle herhangi bir konuşma yapmaz. Her zaman aynıdır ... isteği bir tmp dosyasına kaydetme ve sayfa sunma. So: - Doğru sıcaklık dosyası nasıl alınır? -> Bence bu bir hatadır. Doğru bir yol ve isim alıyorum ama "sayı" bozuk. idk ... bir yükleme gerçekleşirse java tmp yolunu geçici olarak değiştirmeli ve ardından dosyayı her zaman silmem gerekir. O zaman herhangi bir adlandırmadan bağımsız olarak sadece bir tmp dosyası var mı? - html isteği üstbilgisini dosyadan nasıl silebilirim

Ya da yanlış bir şey yapıyorum? Dosyaları nanohttpd'ye yüklemenin doğru yolu bu mu? Yardımınız için

thx!

+0

Temmuz ayında yayınladığınızı biliyorum, ancak bir çözüm buldunuz mu? NanoHttpd ikili dosyaları – twig

+0

No sry için bile readLine() kullanır çünkü bozuk PNG dosyaları alıyorum. Bir çözüm bulamadım: (Sadece vazgeçtim. – user3796786

cevap

3

"Paylaşım buldunuz mu?" soru, ama bugün cevap verene kadar yayınlamayı unuttum.

<form method="post" enctype="multipart/form-data" action="http://whatever.com/path/"> 
    <input type="file" name="file" /> 
    <input type="hidden" name="extra_data" value='blah blah blah' /> 
    <input type="submit" value="Send" /> 
</form> 

Ve Java kodu:

if (session.getMethod() == Method.POST) { 
    try { session.parseBody(files); } 
    catch (IOException e1) { e1.printStackTrace(); } 
    catch (ResponseException e1) { e1.printStackTrace(); } 

    extraData = session.getParms().get("extra_data"); 
    File file = new File(files.get("file")); 
} 

önemli şey yolluyoruz veri dosyası verileri, dosya adı ve dosya mim türü ile geliyor olması.

Durumumda, POST için python isteği kullanıyordum ve yeterli veri göndermiyordum. Doğru sonrası yapısı olacaktır:

file_data = { 'file': ('test.png', open('../some_file.png', 'rb'), 'image/png') } 
requests.post("http://whatever.com/path", data = { 'extra_data': "blah blah blah" }, files = file_data) 

kod yukarıdaki "some_file.png" dan okur, ancak "test.png" deniyor söyler.

Bu yardımcı olur umarım!