2016-04-13 16 views
0

numaralı telefonu arayarak Dosyaları yüklemek için web uygulamasında şu Rest yöntemini kullanıyorum. Metin dosyalarını yüklediğimde, doğru şekilde kaydedilirler ve açabilirim. Ancak başka bir formatta * .docx veya * .pdf veya * .jpg olması durumunda dosyalar orijinal dosya olarak tam boyutta saklanır ancak bozulur. aşağıdaki gibiREST yöntemiyle yüklenen bozuk dosyalar,

@POST 
@Consumes("multipart/form-data") 
public Response readFile() throws IOException, ServletException { 
    Part filePart = request.getPart("c"); 
    InputStream f = filePart.getInputStream(); 
    String l = null; 
    DataInputStream ds = new DataInputStream(f); 
    File file = new File("c:\\temp\\" + getSubmittedFileName(filePart)); 
    try { 
     BufferedWriter bw = new BufferedWriter(new FileWriter(file)); 
     while ((l = ds.readLine()) != null) { 
      bw.write(l); 
     } 
     bw.flush(); 
     bw.close(); 
     return Response.status(201).entity("File Created").build(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return Response.status(500).build(); 
} 

ve html sayfası: Aşağıdaki kodu

<form action="api/fetch" method="post" enctype="multipart/form-data"> 
     <input id="c" name="c" type="file" aria-required="true"><br/><br/> 
     <button type="submit">Submit</button> 
</form> 

Doğrusu bundan daha dosya yüklemek için başka bir yolu olmalı varsayalım. Ben How to upload files to server using JSP/Servlet? hakem var ama dosya uzantısı hakkında bir şey söylemez varsayalım. Peki, kodumda neyin yanlış gidiyor?

cevap

2

hata düzgün karakter bayt dönüştürmez DataInputStream.readLine Javadoc

Bu yöntem itibaren burada

DataInputStream ds = new DataInputStream(f); 
... 
while ((l = ds.readLine()) != null) { 

olduğuna inanıyoruz.

Bunun yerine DataInputStream bir FileInputStream kullanmalıdır. FileInputStream, tüm dosyalarınızı bayt olarak ele alır. Belirtilen sorunun yanında, readLine, giriş dosyanızdaki tüm linebreaks'leri okurken de şeritte olacaktır.

düzenleme Gösterim için aşağıdaki küçük kod parçasına bakın.

dosya dummy.txt

foo 
bar 

foo sonra linebreak tek \n olduğunu içeriyor. Bir altıgen dökümü yılında Şimdi dosya bir kez FileInputStream

try (DataInputStream ds = new DataInputStream(new FileInputStream("dummy.txt")); 
     Writer bw = new BufferedWriter(new FileWriter("out_writer.txt"))) { 
    String l; 
    while ((l = ds.readLine()) != null) { 
     bw.write(l); 
    } 
} 
try (InputStream in = new FileInputStream("dummy.txt"); 
     OutputStream out = new FileOutputStream("out_inputstream.txt")) { 
    byte[] buffer = new byte[8192]; 
    int readBytes = -1; 
    while ((readBytes = in.read(buffer)) > -1) { 
     out.write(buffer, 0, readBytes); 
    } 
} 

ile bir kez DataInputStream kullanılarak okunur

66 6F 6F 0A 62 61 72 

olan çıkış dosyalardır

out_writer.txt
ASCII: foobar 
hex : 66 6F 6F 62 61 72 

Eğer DataInputStream örnekte sıyrılmıştır 0A (\n) görüldüğü gibi

ASCII: foo 
     bar 
hex : 66 6F 6F 0A 62 61 72 

out_inputstream.txt. Ve bu çentikli line break çıktı dosyalarınızı canlandırıyor.

+0

mükemmel çalışır. derinlemesine açıklama için teşekkürler :) – BingAring