title: JAVA - Download Binary File (e.g. PDF) file from Webserver
body: <p>I need to download a pdf file from a webserver to my pc and save it locally.</p>
  
  <p>I used Httpclient to connect to webserver and get the content body:</p>
  
  <pre><code>HttpEntity entity=response.getEntity();
                  InputStream in=entity.getContent();
  
                  String stream = CharStreams.toString(new InputStreamReader(in));
                  int size=stream.length();
                  System.out.println("stringa html page LENGTH:"+stream.length());
                   System.out.println(stream);
                   SaveToFile(stream);
  </code></pre>
  
  <p>Then i save content in a file:</p>
  
  <pre><code>                              //check CRLF (i don't know if i need to to this)
                                     String[] fix=stream.split("\r\n");
  
                                        File file=new              File("C:\\Users\\augusto\\Desktop\\progetti web\\test\\test2.pdf");
                                        PrintWriter out = new PrintWriter(new FileWriter(file));
                                        for (int i = 0; i &lt; fix.length; i++)  {
                                            out.print(fix[i]);
                                           out.print("\n");
  
                                        }
                                       out.close();
  </code></pre>
  
  <p>I also tried to save a String content to file directly:</p>
  
  <pre><code>                         OutputStream out=new FileOutputStream("pathPdfFile");
                           out.write(stream.getBytes());
                           out.close();
  </code></pre>
  
  <p>But the result is always the same: I can open pdf file but i can see white pages only. Does the mistake is around pdf stream and endstream charset encoding? Does pdf content between stream and endStream need to be manipulate in some others way?</p>
  
  <hr>
  
  <p>Hope this helps to avoid some misunderstanding about what i want to do:</p>
  
  <p>This is my login (works perfectly):</p>
  
  <pre><code>  public static void postForm(){
      String cookie="";
      try {
     System.out.println("POSTFORM ###################################");
       String postURL = "http://login.libero.it/logincheck.php";
      HttpPost post = new HttpPost(postURL);
          post.setHeader("User-Agent", "Chrome/14.0.835.202");
          post.setHeader("Referer","http://login.libero.it/?layout=m&amp;service_id=m_mail&amp;ret_url=http://m.mailbeta.libero.it/m/wmm/auth/check");
          if(cookieVector.size()&gt;0){
             for(int i=0;i&lt;cookieVector.size();i++){
                cookie=cookie+cookieVector.elementAt(i).toString().replace("Set-Cookie:", "")+";";
  
               }
                post.setHeader("Cookie",cookie);
  
          }
          //System.out.println("sequenza cookie post:"+cookie);
          List&lt;NameValuePair&gt; params = new ArrayList&lt;NameValuePair&gt;();
          params.add(new BasicNameValuePair("SERVICE_ID", "m_mail"));
          params.add(new BasicNameValuePair("LAYOUT", "m"));
          params.add(new BasicNameValuePair("DEVICE", ""));
          params.add(new  BasicNameValuePair("RET_URL","http://m.mailbeta.libero.it/m/wmm/auth/check"));
          params.add(new BasicNameValuePair("LOGINID", "secret"));
          params.add(new BasicNameValuePair("PASSWORD", "secret"));
          UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8);
          System.out.println("stringa urlPost:"+ent.toString());
          post.setEntity(ent);
          HttpResponse responsePOST = client.execute(post);
                  System.out.println("Response postForm: " +              responsePOST.getStatusLine());
          Header[] allHeaders = responsePOST.getAllHeaders();
  
      String location = "";
      for (Header header : allHeaders) {
          if("location".equalsIgnoreCase(header.getName())) location = header.getValue();
          responsePOST.addHeader(header.getName(), header.getValue());
      }
      cookieVector.clear();
      Header[] headerx=responsePOST.getHeaders("Set-Cookie");
      System.out.println("array header:"+headerx.length);
          for(int i=0;i&lt;headerx.length;i++){
               System.out.println("restituito cookie POST:"+headerx[i].getValue());
             cookieVector.add(headerx[i]);
             //System.out.println("cookie trovato POST:"+cookieVector.elementAt(i));
          }
          //System.out.println("inseriti"+cookieVector.size()+""+"elements");
          //HttpEntity resEntity = responsePOST.getEntity();
  
          // populate redirect information in response
           //CONTROLLO ESITO LOGIN
                       if(location.contains("https://login.libero.it/logincheck.php")){
                            loginError=1;
                       }
                   System.out.println("Redirecting to: " + location);
                   //EntityUtils.consume(resEntity);
                                   responsePOST.getEntity().consumeContent();
                   System.out.println("torno a GET:"+"url:"+location+"cookieVector size:"+cookieVector.size());
                   get(location,"http://login.libero.it/logincheck.php");
  
  
  
  
      }  catch (IOException ex) {
          Logger.getLogger(LiberoLoginNew.class.getName()).log(Level.SEVERE, null, ex);
      }
  
  }
  </code></pre>
  
  <p>Once logged i'm able to access to the file's link (pdf,image,doc, exc.). In this case we take for example a pdf file: </p>
  
  <pre><code>    public static void httpConnection(String url,String referer,String cookieAuth){
      try {
          String location="";
          String cookie="";
          HttpResponse response;
          HttpGet get;
          HttpEntity respEntity;
          Referer=referer;
          System.out.println("HTTPCONNECTION ################################");
          System.out.println("connessione a:"+url+"............");
  
          get = new HttpGet(url);
          if(referer.length()&gt;0){
          //httpget.setHeader("Referer",referer );
  
          }
             if(attachmentURL.size()==0){
              get.setHeader("User-Agent", "Chrome/14.0.835.202");
             }else{
  
             get.setHeader("Accept-charset", "UTF-8");
  
               get.setHeader("Content-type", "application/pdf");
             }
          if(cookieVector.size()&gt;0){
              System.out.println("iserisco cookie da vector");
           for(int i=0;i&lt;cookieVector.size();i++){
             cookie=cookie+cookieVector.elementAt(i).toString().replace("Set-Cookie:", "")+";";
            }
           get.setHeader("Cookie", cookie);
          }else if(cookieAuth.length()&gt;0){
              System.out.println("inserisco cookieAuth....");
              System.out.println("valore cookieSession:"+cookieAuth);
              get.setHeader("Cookie",cookieAuth.replace("Set-Cookie:", "")+";");
          }
  
          response = client.execute(get);
          cookieVector.clear();//reset cookie
  
  
          System.out.println("home get: " + response.getStatusLine());
  
  
          Header[] headery=response.getAllHeaders();
           for(int j=0;j&lt;headery.length;j++){
                              System.out.println(headery[j].getName()+" "+" VALUE:"+" "+headery[j].getValue());
           }
          Header[] headerx=response.getHeaders("Set-Cookie");
          System.out.println("array header:"+headerx.length);
            System.out.print("httpconnection SERVER HEADERS ###############");
          for(int i=0;i&lt;headerx.length;i++){
               if("location".equalsIgnoreCase(headerx[i].getName())){
                   location = headerx[i].getValue();
                    //ResponseGET.addHeader(headerx[i].getName(), header.getValue());
               }
  
          //System.out.println(headerx[i].getValue());
          cookieVector.add(headerx[i]);
          }
  
  
                //STREAM CONTENT BODY
  
                  HttpEntity entity2=response.getEntity();
                  InputStream in=entity2.getContent(); &lt;==THIS IS THE WAY I GET STREAM RESPONSE
  
  
                 if(attachmentURL.size()&gt;0){
                     saveAttachment(in);//SAVE FILE &lt;==
                 }else{
                  from(in,htmlpage);//Parse and grab: message title,subject,attachments. If attachments are found then come back here and execute the method saveAttachment.
                  in.close();
                 }
  
      } catch (IOException ex) {
          Logger.getLogger(LiberoLoginNew.class.getName()).log(Level.SEVERE, null, ex);
      }
  
  }
  </code></pre>
  
  <p>Method httpConnection works and i can download the file!!</p>
  
  <p>Server Response:</p>
  
  <pre><code> Date  VALUE: Fri, 18 Nov 2011 13:09:46 GMT
   Server  VALUE: Apache/2.2.21 (Unix) mod_jk/1.2.23
    Set-Cookie  VALUE: MST_PVP=tiQZO3nbl9_5f_OQXtJP32YiqQx_5f_kSh6F6Io7r3xS;       Domain=m.libero.it; Path=/
    Content-Type  VALUE: application/octet-stream
    Expires  VALUE: Fri, 18 Nov 2011 15:09:46 GMT
    Transfer-Encoding  VALUE: chunked
  </code></pre>
  
  <p>Example of response body: </p>
  
  <pre><code> %PDF-1.7
  
   1 0 obj  % entry point
   &lt;&lt;
  /Type /Catalog
  /Pages 2 0 R
  </code></pre>
  
  <blockquote>
    <p>>
        endobj</p>
  </blockquote>
  
  <pre><code> 2 0 obj
   &lt;&lt;
   /Type /Pages
   /MediaBox [ 0 0 200 200 ]
   /Count 1
   /Kids [ 3 0 R ]
   &gt;&gt;
    endobj
  
    3 0 obj
    &lt;&lt;
   /Type /Page
   /Parent 2 0 R
   /Resources &lt;&lt;
    /Font &lt;&lt;
    /F1 4 0 R 
  &gt;&gt;
  &gt;&gt;
  /Contents 5 0 R
  &gt;&gt;
  endobj
  
  4 0 obj
  &lt;&lt;
  /Type /Font
  /Subtype /Type1
  /BaseFont /Times-Roman
  &gt;&gt;
  endobj
  
  5 0 obj  % page content
  &lt;&lt;
   /Length 44
   &gt;&gt;
   stream
    BT
    70 50 TD
   /F1 12 Tf
   (Hello, world!) Tj
    ET
    endstream
    endobj
  
    xref
    0 6
   0000000000 65535 f 
   0000000010 00000 n 
   0000000079 00000 n 
   0000000173 00000 n 
   0000000301 00000 n 
  0000000380 00000 n 
  trailer
  &lt;&lt;
  /Size 6
  /Root 1 0 R
   &gt;&gt;
   startxref
   492
   %%EOF
  </code></pre>
  
  <p>Now,let starts from here. 
  Can you,please, tell me what i have to do to save the stream in a file?  </p>
  
  ###########  SOLVED:
  
  <p>To save a file locally from the Stream data, respecting the binary data nature, i did like this:</p>
  
  <pre><code>  public void saveFile(InputStream is){
  
     try {
          DataOutputStream out = new DataOutputStream(new  BufferedOutputStream(new FileOutputStream(new File("test.pdf"))));
          int c;
          while((c = is.read()) != -1) {
              out.writeByte(c);
          }
          out.close();
                      is.close();
      }catch(IOException e) {
          System.err.println("Error Writing/Reading Streams.");
      }
       }
  </code></pre>
  
  <p>If you want a more efficent method you can use java.IOUtils and do like this:</p>
  
  <pre><code>   public void saveFile(InputStream is){
  
        OutputStream os=new FileOutputStream(new File("test.pdf"));        
        byte[] bytes = IOUtils.toByteArray(is);
        os.write(bytes);
        os.close();
  
      }
  </code></pre>