1

I have an app that sends an image to a server using HttpCliend and MultipartEntityBuilder. My problem is that the sending isn't successful. I get a message "Invalid file" from the server.

This is my sending method:

public void executeMultipartPost() throws ClientProtocolException, IOException { String result = ""; Log.d("DrawingFragment", "executeMultipartPost"); httpClient.setCookieStore(signiture.getCookies()); HttpPost httpPostRequest = new HttpPost(url); File file = new File(signiturePath); FileBody bin = new FileBody(file); Log.v("FileBody", bin.getFilename()); Log.d("signiturePath", signiturePath); MultipartEntityBuilder multiPartEntityBuilder = MultipartEntityBuilder .create(); Log.i("HttpRequest Headers", "==========================================================="); Header headers[] = httpPostRequest.getAllHeaders(); for(Header h:headers) { Log.i("", h.getName() + ": " + h.getValue() + "\n"); } Log.i("", "==========================================================="); multiPartEntityBuilder.addTextBody("Content-Type", "image/png"); multiPartEntityBuilder.addPart("file", bin); httpPostRequest.setEntity(multiPartEntityBuilder.build()); HttpResponse httpResponse = null; httpResponse = httpClient.execute(httpPostRequest); Log.i("HttpResponse Headers", "==========================================================="); headers = httpResponse.getAllHeaders(); for(Header h:headers) { Log.i("", h.getName() + ": " + h.getValue() + "\n"); } Log.i("", "==========================================================="); InputStream inputStream = null; inputStream = httpResponse.getEntity().getContent(); if (inputStream != null) { result = convertInputStreamToString(inputStream); } else { result = "Did not work!"; } Log.i("UploadPhoto", result); } 

And this is the php server:

<?php $allowedExts = array("gif", "jpeg", "jpg", "png"); $temp = explode(".", $_FILES["file"]["name"]); $extension = end($temp); echo "Upload: " . $_FILES["file"]["name"] . "\n"; echo "Upload: " . $_FILES["file"]["type"] . "\n"; if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/pjpeg") || ($_FILES["file"]["type"] == "image/x-png") || ($_FILES["file"]["type"] == "image/png")) && in_array($extension, $allowedExts)) { echo "Passed First If"; if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br>"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br>"; echo "Type: " . $_FILES["file"]["type"] . "<br>"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>"; if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "./" . $_FILES["file"]["name"]); echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; } ?> 

And this is what I have in the logcat:

07-14 22:57:05.720: I/HttpRequest Headers(14081): =========================================================== 07-14 22:57:05.720: I/(14081): =========================================================== 07-14 22:57:05.960: I/HttpResponse Headers(14081): =========================================================== 07-14 22:57:05.960: I/(14081): Date: Mon, 14 Jul 2014 20:59:38 GMT 07-14 22:57:05.960: I/(14081): Server: Microsoft-IIS/6.0 07-14 22:57:05.960: I/(14081): X-Powered-By: ASP.NET 07-14 22:57:05.960: I/(14081): X-Powered-By: PHP/5.3.5 07-14 22:57:05.960: I/(14081): Content-type: text/html 07-14 22:57:05.960: I/(14081): Content-Length: 63 07-14 22:57:05.960: I/(14081): =========================================================== 07-14 22:57:05.960: I/UploadPhoto(14081): Upload: image.pngUpload: application/octet-streamInvalid file 

As you can see the file get's to the server but does not pass any of the if conditions. I tried with httpPostRequest.setHeader("Content-type", "image/png;"); but it didn't work. Can you tell me what is the problem and how to fix it? Thanks.

2 Answers 2

1

Use

FileBody bin = new FileBody(file, "image/png"); 

You want to set the content type for the file, not for the request. See the org.apache.http documentation for more details

Sign up to request clarification or add additional context in comments.

6 Comments

Using like that FileBody is deprecated.
You mean using a string as the second argument? The recommended way seems to be new FileBody(file, new ContentType("image/png")); then.
The constructor ContentType(String) is undefined. I tried the other way with new FileBody(file, "image/png"); but then the file does not even gets to the server.
Look at the documentation. String to ContentType would be ContentType.create("image/png"); as it seems.
Then did you remove addTextBody()?
|
0

I figured it out. I upload the image as a binary body and there I set the type and the name:

multiPartEntityBuilder.addBinaryBody(imageName, byteArray, ContentType.create("image/png"), "image.png"); 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.