Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Tuesday, June 14, 2016

How to upload a file using Java HttpClient library working with PHP

How to upload a file using Java HttpClient library working with PHP


I want to write Java application that will upload a file to the Apache server with PHP. The Java code uses Jakarta HttpClient library version 4.0 beta2:

import java.io.File;  import org.apache.http.HttpEntity;  import org.apache.http.HttpResponse;  import org.apache.http.HttpVersion;  import org.apache.http.client.HttpClient;  import org.apache.http.client.methods.HttpPost;  import org.apache.http.entity.FileEntity;  import org.apache.http.impl.client.DefaultHttpClient;  import org.apache.http.params.CoreProtocolPNames;  import org.apache.http.util.EntityUtils;      public class PostFile {    public static void main(String[] args) throws Exception {      HttpClient httpclient = new DefaultHttpClient();      httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);        HttpPost httppost = new HttpPost("http://localhost:9002/upload.php");      File file = new File("c:/TRASH/zaba_1.jpg");        FileEntity reqEntity = new FileEntity(file, "binary/octet-stream");        httppost.setEntity(reqEntity);      reqEntity.setContentType("binary/octet-stream");      System.out.println("executing request " + httppost.getRequestLine());      HttpResponse response = httpclient.execute(httppost);      HttpEntity resEntity = response.getEntity();        System.out.println(response.getStatusLine());      if (resEntity != null) {        System.out.println(EntityUtils.toString(resEntity));      }      if (resEntity != null) {        resEntity.consumeContent();      }        httpclient.getConnectionManager().shutdown();    }  }  

The PHP file upload.php is very simple:

  

Reading the response I get the following result:

executing request POST http://localhost:9002/upload.php HTTP/1.1  
  HTTP/1.1 200 OK  Possible file upload attack: filename ''.  Array  (  )  

So the request was successful, I was able to communicate with server, however PHP didn't notice the file - the method is_uploaded_file returned false and $_FILES variable is empty. I have no idea why this might happend. I have tracked HTTP response and request and they look ok:
request is:

  POST /upload.php HTTP/1.1  Content-Length: 13091  Content-Type: binary/octet-stream  Host: localhost:9002  Connection: Keep-Alive  User-Agent: Apache-HttpClient/4.0-beta2 (java 1.5)  Expect: 100-Continue    ˙Ř˙ŕ..... the rest of the binary file...  

and response:

  HTTP/1.1 100 Continue    HTTP/1.1 200 OK  Date: Wed, 01 Jul 2009 06:51:57 GMT  Server: Apache/2.2.8 (Win32) DAV/2 mod_ssl/2.2.8 OpenSSL/0.9.8g mod_autoindex_color PHP/5.2.5 mod_jk/1.2.26  X-Powered-By: PHP/5.2.5  Content-Length: 51  Keep-Alive: timeout=5, max=100  Connection: Keep-Alive  Content-Type: text/html    Possible file upload attack: filename ''.Array  (  )  

I was testing this both on the local windows xp with xampp and remote Linux server. I have also tried to use previous version of HttpClient - version 3.1 - and the result was even more unclear, is_uploaded_file returned false, however $_FILES array was filled with proper data.

Answer by Sohnee for How to upload a file using Java HttpClient library working with PHP


If you are testing this on your local WAMP you might need to set up the temporary folder for file uploads. You can do this in your PHP.ini file:

upload_tmp_dir = "c:\mypath\mytempfolder\"  

You will need to grant permissions on the folder to allow the upload to take place - the permission you need to grant vary based on your operating system.

Answer by kgiannakakis for How to upload a file using Java HttpClient library working with PHP


The correct way will be to use multipart POST method. See here for example code for the client.

For PHP there are many tutorials available. This is the first I've found. I recommend that you test the PHP code first using an html client and then try the java client.

Answer by Piotr Kochański for How to upload a file using Java HttpClient library working with PHP


Ok, the Java code I used was wrong, here comes the right Java class:

import java.io.File;  import org.apache.http.HttpEntity;  import org.apache.http.HttpResponse;  import org.apache.http.HttpVersion;  import org.apache.http.client.HttpClient;  import org.apache.http.client.methods.HttpPost;  import org.apache.http.entity.mime.MultipartEntity;  import org.apache.http.entity.mime.content.ContentBody;  import org.apache.http.entity.mime.content.FileBody;  import org.apache.http.impl.client.DefaultHttpClient;  import org.apache.http.params.CoreProtocolPNames;  import org.apache.http.util.EntityUtils;      public class PostFile {    public static void main(String[] args) throws Exception {      HttpClient httpclient = new DefaultHttpClient();      httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);        HttpPost httppost = new HttpPost("http://localhost:9001/upload.php");      File file = new File("c:/TRASH/zaba_1.jpg");        MultipartEntity mpEntity = new MultipartEntity();      ContentBody cbFile = new FileBody(file, "image/jpeg");      mpEntity.addPart("userfile", cbFile);          httppost.setEntity(mpEntity);      System.out.println("executing request " + httppost.getRequestLine());      HttpResponse response = httpclient.execute(httppost);      HttpEntity resEntity = response.getEntity();        System.out.println(response.getStatusLine());      if (resEntity != null) {        System.out.println(EntityUtils.toString(resEntity));      }      if (resEntity != null) {        resEntity.consumeContent();      }        httpclient.getConnectionManager().shutdown();    }  }  

note using MultipartEntity.

Answer by fervisa for How to upload a file using Java HttpClient library working with PHP


For those having a hard time implementing the accepted answer (which requires org.apache.http.entity.mime.MultipartEntity) you may be using org.apache.httpcomponents 4.2.* In this case, you have to explicitly install httpmime dependency, in my case:

      org.apache.httpcomponents      httpmime      4.2.5    

Answer by gaojun1000 for How to upload a file using Java HttpClient library working with PHP


I ran into the same problem and found out that the file name is required for httpclient 4.x to be working with PHP backend. It was not the case for httpclient 3.x.

So my solution is to add a name parameter in the FileBody constructor. ContentBody cbFile = new FileBody(file, "image/jpeg", "FILE_NAME");

Hope it helps.

Answer by Brent Robinson for How to upload a file using Java HttpClient library working with PHP


An update for those trying

to use MultipartEntity...

org.apache.http.entity.mime.MultipartEntity is deprecated in 4.3.1.

You can use MultipartEntityBuilder to create the HttpEntity object.

File file = new File();    HttpEntity httpEntity = MultipartEntityBuilder.create()      .addBinaryBody("file", file, ContentType.create("image/jpeg"), file.getName())      .build();  

For Maven users the class is available in the following dependency (almost the same as fervisa's answer, just with a later version).

    org.apache.httpcomponents    httpmime    4.3.1    

Answer by Krystian for How to upload a file using Java HttpClient library working with PHP


There is my working solution for sending image with post, using apache http libraries (very important here is boundary add It won't work without it in my connection):

            ByteArrayOutputStream baos = new ByteArrayOutputStream();              bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);              byte[] imageBytes = baos.toByteArray();                HttpClient httpclient = new DefaultHttpClient();              HttpPost httpPost = new HttpPost(StaticData.AMBAJE_SERVER_URL + StaticData.AMBAJE_ADD_AMBAJ_TO_GROUP);                String boundary = "-------------" + System.currentTimeMillis();                httpPost.setHeader("Content-type", "multipart/form-data; boundary="+boundary);                ByteArrayBody bab = new ByteArrayBody(imageBytes, "pic.png");              StringBody sbOwner = new StringBody(StaticData.loggedUserId, ContentType.TEXT_PLAIN);              StringBody sbGroup = new StringBody("group", ContentType.TEXT_PLAIN);                HttpEntity entity = MultipartEntityBuilder.create()                      .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)                      .setBoundary(boundary)                      .addPart("group", sbGroup)                      .addPart("owner", sbOwner)                      .addPart("image", bab)                      .build();                httpPost.setEntity(entity);                try {                  HttpResponse response = httpclient.execute(httpPost);                  ...then reading response  

Answer by user4286889 for How to upload a file using Java HttpClient library working with PHP


Aah you just need to add a name parameter in the

FileBody constructor. ContentBody cbFile = new FileBody(file, "image/jpeg", "FILE_NAME");  

Hope it helps.

Answer by rado for How to upload a file using Java HttpClient library working with PHP


A newer version example is here.

Below is a copy of the original code:

/*   * ====================================================================   * Licensed to the Apache Software Foundation (ASF) under one   * or more contributor license agreements.  See the NOTICE file   * distributed with this work for additional information   * regarding copyright ownership.  The ASF licenses this file   * to you under the Apache License, Version 2.0 (the   * "License"); you may not use this file except in compliance   * with the License.  You may obtain a copy of the License at   *   *   http://www.apache.org/licenses/LICENSE-2.0   *   * Unless required by applicable law or agreed to in writing,   * software distributed under the License is distributed on an   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY   * KIND, either express or implied.  See the License for the   * specific language governing permissions and limitations   * under the License.   * ====================================================================   *   * This software consists of voluntary contributions made by many   * individuals on behalf of the Apache Software Foundation.  For more   * information on the Apache Software Foundation, please see   * .   *   */  package org.apache.http.examples.entity.mime;    import java.io.File;    import org.apache.http.HttpEntity;  import org.apache.http.client.methods.CloseableHttpResponse;  import org.apache.http.client.methods.HttpPost;  import org.apache.http.entity.ContentType;  import org.apache.http.entity.mime.MultipartEntityBuilder;  import org.apache.http.entity.mime.content.FileBody;  import org.apache.http.entity.mime.content.StringBody;  import org.apache.http.impl.client.CloseableHttpClient;  import org.apache.http.impl.client.HttpClients;  import org.apache.http.util.EntityUtils;    /**   * Example how to use multipart/form encoded POST request.   */  public class ClientMultipartFormPost {        public static void main(String[] args) throws Exception {          if (args.length != 1)  {              System.out.println("File path not given");              System.exit(1);          }          CloseableHttpClient httpclient = HttpClients.createDefault();          try {              HttpPost httppost = new HttpPost("http://localhost:8080" +                      "/servlets-examples/servlet/RequestInfoExample");                FileBody bin = new FileBody(new File(args[0]));              StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN);                HttpEntity reqEntity = MultipartEntityBuilder.create()                      .addPart("bin", bin)                      .addPart("comment", comment)                      .build();                  httppost.setEntity(reqEntity);                System.out.println("executing request " + httppost.getRequestLine());              CloseableHttpResponse response = httpclient.execute(httppost);              try {                  System.out.println("----------------------------------------");                  System.out.println(response.getStatusLine());                  HttpEntity resEntity = response.getEntity();                  if (resEntity != null) {                      System.out.println("Response content length: " + resEntity.getContentLength());                  }                  EntityUtils.consume(resEntity);              } finally {                  response.close();              }          } finally {              httpclient.close();          }      }    }  

Answer by Dev for How to upload a file using Java HttpClient library working with PHP


I knew I am late to the party but below is the correct way to deal with this, the key is to use InputStreamBody in place of FileBody to upload multi-part file.

   try {          HttpClient httpclient = new DefaultHttpClient();          HttpPost postRequest = new HttpPost("https://someserver.com/api/path/");          postRequest.addHeader("Authorization",authHeader);          //don't set the content type here                      //postRequest.addHeader("Content-Type","multipart/form-data");          MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);              File file = new File(filePath);          FileInputStream fileInputStream = new FileInputStream(file);          reqEntity.addPart("parm-name", new InputStreamBody(fileInputStream,"image/jpeg","file_name.jpg"));            postRequest.setEntity(reqEntity);          HttpResponse response = httpclient.execute(postRequest);            }catch(Exception e) {              Log.e("URISyntaxException", e.toString());     }  


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

Related Posts:

0 comments:

Post a Comment

Popular Posts

Fun Page

Powered by Blogger.