My code:
public static String newName =""; //the traditional Chinese file name
public static String uploadFile =""; //the file path contain traditional Chinese
public static String ActionUrl =""; //the server
public static void upload() {
String end = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
try {
URL url = new URL(ActionUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestMethod("POST");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Accept", "text/*");
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
DataOutputStream ds = new DataOutputStream(con.getOutputStream());
ds.writeBytes(twoHyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data;" + "name=\"folder\"" + end + end + "/mnt/HD/HD_a2/test/" + end);
ds.writeBytes(twoHyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data;" + "name=\"Filedata\"; filename=\"" + newName + "\"" + end);
ds.writeBytes(end);
FileInputStream fStream = new FileInputStream(uploadFile);
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int length = -1;
while((length = fStream.read(buffer)) != -1) {
ds.write(buffer, 0, length);
}
ds.writeBytes(end);
ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
fStream.close();
ds.flush();
InputStream is = con.getInputStream();
int ch;
StringBuffer b = new StringBuffer();
while((ch = is.read()) != -1) {
b.append((char)ch);
}
System.out.println("UPLOAD" + "SUCCESS");
ds.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
It upload file success, but it show the garbled file name.
How to modify it?
try replace with below:
ds.writeBytes(twoHyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data;" + "name=\"folder\"" + end + end + "/mnt/HD/HD_a2/test/" + end);
ds.writeBytes(twoHyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data;" + "name=\"Filedata\"; filename=\"");
ds.write(newName.getBytes("UTF-8"));
ds.writeBytes("\"" + end);
ds.writeBytes(end);
Related
I have a problem with uploading file to the server. Here i'm trying to create the registration form.
I need to upload all values that taken from user, along with that i need to upload the resume resume is in PDF format.
Here is my code. Please look into it.
public String serverResponse(String mFilePath){
HttpClient client = new DefaultHttpClient();
HttpPost poster = new HttpPost(mUrl);
File resume = new File(mFilePath); //Actual file from the device
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.addPart("name", new StringBody("name"));
entity.addPart("phone", new StringBody("1234567890"));
entity.addPart("attachment", new FileBody(resume));
poster.setEntity(entity);
return client.execute(poster, new ResponseHandler<String>() {
public String handleResponse(HttpResponse response) throws IOException {
HttpEntity respEntity = response.getEntity();
return EntityUtils.toString(respEntity);
}
});
}
The problem is above code works when i send the data to url("http://www.example.com"), and it doesn't works on the url("https://www.example.com").
can anyone tell what's wrong on my code.
Please help me on this.
Edit : I checked the request from android in server side, there i found empty data in request and it response back with default message(response that set in server).
so my request hits the server with empty values. Is problem in my code (or) server side ?
just now i checked, that this same URL works fine in website.
Please direct me in correct way if i was wrong
Thanks in Advance.
try this code i hope this will help you.
public String uploadFile(String filePath, String name, String phone, String url) throws Exception {
String crlf = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
HttpURLConnection httpUrlConnection = null;
OutputStream outputStream = null;
InputStream inputStream = null;
InputStreamReader in = null;
try {
URL urlObj = new URL(url);
httpUrlConnection = (HttpURLConnection) urlObj.openConnection();
httpUrlConnection.setReadTimeout(10 * 1000);
httpUrlConnection.setConnectTimeout(10 * 1000);
httpUrlConnection.setDoInput(true);
File file = new File(filePath);
if (file != null) {
httpUrlConnection.setUseCaches(false);
httpUrlConnection.setRequestMethod("POST");
httpUrlConnection.setRequestProperty("Connection", "Keep-Alive");
httpUrlConnection.setRequestProperty("Cache-Control", "no-cache");
httpUrlConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
outputStream = httpUrlConnection.getOutputStream();
outputStream.write((crlf + twoHyphens + boundary + crlf).getBytes());
outputStream.write(("Content-Disposition: form-data; name=\"name\"" + crlf + crlf + name).getBytes());
outputStream.write((crlf + twoHyphens + boundary + crlf).getBytes());
outputStream.write(("Content-Disposition: form-data; name=\"phone\"" + crlf + crlf + phone).getBytes());
outputStream.write((crlf + twoHyphens + boundary + crlf).getBytes());
Log.e("Response :", "Response Code : " + file.getName());
outputStream.write(("Content-Disposition: form-data; name=\"file\"; filename=\""
+ file.getName()
+ "\""
+ crlf
+ "Content-Type: image/jpeg" + crlf).getBytes());
outputStream.write(crlf.getBytes());
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.write(crlf.getBytes());
outputStream.write((twoHyphens + boundary + twoHyphens + crlf).getBytes());
outputStream.flush();
outputStream.close();
fis.close();
}
httpUrlConnection.connect();
Log.e("Response :", "Response Code : " + httpUrlConnection.getResponseCode());
if (httpUrlConnection.getResponseCode() == -1) {
onImageUploadCompleted.onImageUploadCompleted("error -1");
Log.e("Connection error", "Connection error: url " + url);
String json = "{\"error\": {\"code\": 991, \"message\": \"Connection error: `991`\"}}";
}
if (httpUrlConnection.getResponseCode() == 204) {
return "Upload failed";
}
if (httpUrlConnection.getResponseCode() == 200) {
inputStream = httpUrlConnection.getInputStream();
}
else
inputStream = httpUrlConnection.getErrorStream();
in = new InputStreamReader(inputStream);
StringBuilder sb = new StringBuilder();
int read;
char[] buff = new char[1024];
while ((read = in.read(buff)) != -1) {
sb.append(buff, 0, read);
}
File f = new File(filePath);
f.delete();
Log.e("Response ", "Response text : " + sb.toString());
if (httpUrlConnection.getResponseCode() != 200) {
//ParseJson.parseException(sb.toString());
Log.e("Failed", "Failed safe : " + sb.toString());
return sb.toString();
}
return sb.toString();
} catch (Exception e) {
if (outputStream != null) {
outputStream.close();
}
if (in != null) {
in.close();
}
if (inputStream != null) {
inputStream.close();
}
e.printStackTrace();
} finally {
if (httpUrlConnection != null) {
httpUrlConnection.disconnect();
}
}
return null;
}
I use this code to post a file.Should be used in background thread, and function will return the server response.
public String postFile(String mFileName,String apiUrl,String fileType,HashMap<String,String> params) throws Exception{
String output = "null";
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
InputStream inputStream = null;
String twoHyphens = "--";
String boundary = "*****" + Long.toString(System.currentTimeMillis())
+ "*****";
String lineEnd = "\r\n";
String result = "";
int bytesRead, bytesAvailable, bufferSize, bytesTransffered, bytesTotals;
byte[] buffer;
int maxBufferSize = 10;
String[] q = mFileName.split("/");
int idx = q.length - 1;
File file = new File(mFileName);
FileInputStream fileInputStream = new FileInputStream(file);
URL url = new URL(apiUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("User-Agent",
"Android Multipart HTTP Client 1.0");
connection.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + boundary);
outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
Log.d(TAG, "msg is " + q[idx]);
outputStream.writeBytes("Content-Disposition: form-data; name=\""
+ "file" + "\"; filename=\"" + q[idx] + "\"" + lineEnd);
outputStream.writeBytes("Content-Type: " + fileType + lineEnd);
outputStream.writeBytes("Content-Transfer-Encoding: binary"
+ lineEnd);
outputStream.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
long bytesTotal = file.length();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesTransffered = 0;
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
bytesTransffered = bytesRead;
while (bytesRead > 0) {
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
bytesTransffered += bytesRead;
if (mProgressUpdateListener != null) {
publishProgress((100 * bytesTransffered)
/ Integer.parseInt(bytesTotal + ""));
} else {
Log.d(TAG, "Progress Listener is Null");
}
}
outputStream.writeBytes(lineEnd);
Iterator it = params.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
String key= (String) pair.getKey();
String value = (String) pair.getValue();
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"" + key + "\"" + lineEnd);
outputStream.writeBytes("Content-Type: text/plain" + lineEnd);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(value);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens
+ lineEnd);
}
Log.d(TAG,"Response code "+connection.getResponseCode());
if (connection.getResponseCode() == 200) {
InputStream in = connection.getInputStream();
BufferedReader rd = new BufferedReader(
new InputStreamReader(in));
output = "";
String line;
while ((line = rd.readLine()) != null) {
output += line;
}
}
return output;
}
Use Retrofit to uplaod a file.
It is faster and easy
Create an interface
public interface ApiClient {
#Multipart
#POST(NetworkUtils.UPLOAD_PHOTO_URL)
Call<PhotoResponseModel> uploadPhoto(
#Header("id") String id,
#Header("imageId") String imageId,
/*#Part("description") RequestBody description,*/
#Part MultipartBody.Part photo);
}
call this method
public void syncPhoto()
{
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(NetworkUtils.SERVER_PATH)
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.build();
ApiClient apiClient = retrofit.create`(ApiClient.class);
RequestBody filePart = RequestBody.create(/*MediaType.parse(context.getContentResolver().getType(Uri.parse(photoDetails.getImageUrl())))*/
MediaType.parse("image/*"),
file);
MultipartBody.Part fileMultiPart = MultipartBody.Part.createFormData("photo", file.getName(), filePart);
Call<PhotoResponseModel> call = apiClient.uploadPhoto(id, imageId, fileMultiPart);
call.enqueue(new Callback<PhotoResponseModel>() {
#Override
public void onResponse(Call<PhotoResponseModel> call, Response<PhotoResponseModel> response) {
}
}
}
#Override
public void onFailure(Call<PhotoResponseModel> call, Throwable t) {
Log.d("Error", "onFailure: ");
}
});
}
Add dependencies to gradle
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
check this link
https://futurestud.io/tutorials/retrofit-2-how-to-upload-files-to-server
I'm using httpurlconnection for uploading files to different servers.
For some hosts the following code is working and I'm able to upload files, but when I'm trying to upload to another host, I get an error message
"failed to read: line too long: \nContent-Disposition: form-data; name...
What does this error mean? I couldn't find any hints with google. Hope you can help. :)
private void upload(){
response = "";
DataOutputStream outputStream = null;
InputStream inputStream = null;
String twoHyphens = "--";
String boundary = "--------"+Long.toString(System.currentTimeMillis());
String lineEnd = "\n";
try {
File file = getFile();
StringBuffer sb = new StringBuffer();
sb.append(twoHyphens + boundary + lineEnd);
sb.append("Content-Disposition: form-data; name=\"file1\"; filename=\"" + getFilename() +"\"" + lineEnd);
sb.append("Content-Type: " + getMime() + lineEnd);
sb.append("Content-Transfer-Encoding: binary" + lineEnd);
sb.append(lineEnd);
FileInputStream fileInputStream = new FileInputStream(file);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setFixedLengthStreamingMode((uploadContainer.getFilesize() + sb.length() + lineEnd.length() + twoHyphens.length() + boundary.length() + twoHyphens.length() + lineEnd.length()));
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("User-Agent", USER_AGENT);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary);
outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"file1\"; filename=\"" + getFilename() +"\"" + lineEnd);
outputStream.writeBytes("Content-Type: " + getMime() + lineEnd);
outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd);
outputStream.writeBytes(lineEnd);
int bytesRead = -1;
byte[] buffer = new byte[4096];
boolean cancelled = false;
while ((bytesRead = fileInputStream.read(buffer)) > 0){
outputStream.write(buffer, 0, bytesRead);
if(Thread.currentThread().isInterrupted()){
cancelled = true;
break;
}
}
if(cancelled == false){
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
outputStream.flush();
inputStream = connection.getInputStream();
response = convertStreamToString(inputStream);
inputStream.close();
} else {
// ...
}
fileInputStream.close();
} catch(Exception e) {/e.printStackTrace();
} finally {
try {
outputStream.close();
} catch (IOException e) {e.printStackTrace();
}
}
}
String lineEnd = "\n";
The problem is here. The line terminator in HTTP is defined as \r\n, not \n.
Try to upload multiple images with one request but only the first image is uploaded.
This is the java code:
protected String doInBackground(String... args) {
String end = "\r\n";
String twoHyphens = "--";
String boundary = "******";
String result = "Ein Fehler ist aufgetreten";
String charset = "UTF-8";
String insertedReportID;
try
{
insertedReportID = args[0];
/* BEGIN - ADD LOGIN CREDENTIALS TO THE QUERY */
final String authKeyMail = "authMail";
final String authKeyPW = "authPW";
Context mContext = getContext();
SharedPreferences mPrefs = mContext.getSharedPreferences("privPrefs", Context.MODE_PRIVATE);
String email = mPrefs.getString(authKeyMail, "default");
String pw = mPrefs.getString(authKeyPW,"default");
HashMap<String, String> params = new HashMap<>();
params.put("emailadr", email);
params.put("passwrt", pw);
StringBuilder sbParams = new StringBuilder();
int i = 0;
for (String key : params.keySet()) {
try {
if (i != 0){
sbParams.append("&");
}
sbParams.append(key).append("=")
.append(URLEncoder.encode(params.get(key), charset));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
i++;
}
/* END - ADD LOGIN CREDENTIALS TO THE QUERY */
URL url = new URL(UPLOAD_URL);
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
// allow input and output
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
// use POST way
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
httpURLConnection.setRequestProperty("Charset", "UTF-8");
httpURLConnection.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
DataOutputStream dos = new DataOutputStream(
httpURLConnection.getOutputStream());
//BEGIN - ADD LOGIN CREDENTIALS TO THE UPLOADER
dos.writeBytes(twoHyphens + boundary + end);
//"emailadr" MUST BE THE EXACT SAME NAME AS IN PHP $_POST['emailadr']
dos.writeBytes("Content-Disposition: form-data; name=\"emailadr\""+ end);
dos.writeBytes(end);
dos.writeBytes(email);
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + end);
//"passwrt" MUST BE THE EXACT SAME NAME AS IN PHP $_POST['passwrt']
dos.writeBytes("Content-Disposition: form-data; name=\"passwrt\""+ end);
dos.writeBytes(end);
dos.writeBytes(pw);
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + end);
//END - ADD LOGIN CREDENTIALS TO THE UPLOADER
//"playgroundID" MUST BE THE EXACT SAME NAME AS IN PHP $_POST['equipmentID']
dos.writeBytes("Content-Disposition: form-data; name=\"reportID\""+ end);
dos.writeBytes(end);
dos.writeBytes(insertedReportID);
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + end);
//END - ADD LOGIN CREDENTIALS TO THE UPLOADER
//"playgroundID" MUST BE THE EXACT SAME NAME AS IN PHP $_POST['equipmentID']
dos.writeBytes("Content-Disposition: form-data; name=\"imageCounter\""+ end);
dos.writeBytes(end);
dos.writeBytes(String.valueOf(uploadImages.size()));
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + end);
//END - ADD LOGIN CREDENTIALS TO THE UPLOADER
for(int j=0;j<uploadImages.size();j++){
//"image_file" MUST BE THE EXACT SAME NAME AS IN PHP $_FILES['image_file']
dos.writeBytes("Content-Disposition: form-data; name=\"image_file"+String.valueOf(j)+"\"; filename=\""
+ uploadImages.get(j).substring(uploadImages.get(j).lastIndexOf("/") + 1)
+ "\""
+ end);
dos.writeBytes(end);
FileInputStream fis = new FileInputStream(uploadImages.get(j));
byte[] buffer = new byte[8192]; // 8k
int count = 0;
while ((count = fis.read(buffer)) != -1)
{
dos.write(buffer, 0, count);
}
fis.close();
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
Log.d("asdasd", "image_file"+uploadImages.get(j));
}
dos.flush();
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
result = br.readLine();
dos.close();
is.close();
httpURLConnection.disconnect();
} catch (Exception e)
{
e.printStackTrace();
}
return result;
}
Php Code Snippet:
if (isset($_POST)) {
$imageCounter = $_POST['imageCounter'];
for ($i = 0; $i < $imageCounter; $i++) {
if ($_POST['reportID'] == "") {
die('Hier ist etwas schiefgelaufen (Code 100)');
}
// check $_FILES['ImageFile'] not empty
if (!isset($_FILES['image_file'.$i]) || !is_uploaded_file($_FILES['image_file'.$i]['tmp_name'])) {
die('Image file is Missing!'); // output error when above checks fail.
}
//get uploaded file info before we proceed
$image_name = $_FILES['image_file'.$i]['name']; //file name
$image_size = $_FILES['image_file'.$i]['size']; //file size
$image_temp = $_FILES['image_file'.$i]['tmp_name']; //file temp
$image_size_info = getimagesize($image_temp); //gets image size info from valid image file
Now the problem is that only the first image is uploaded and entered into the db.
I think there is something wrong with both sides (Java/Php).
Firstly with java because I can only receive one image on the php side.
I also got this working with ajax by using such a form:
<form action="../php/ajax/views/reports/uploadReportImages.php" method="post" enctype="multipart/form-data" id="MyUploadForm">
<div class="form-group">
<span id="durchsuchenBtn" class="btn btn-info btn-file">
<i class="fa fa-search fa-fw"></i> Durchsuchen <input name="image_file[]" id="imageInput" type="file" multiple="true">
</span>
</div>
</form>
Now I'm not sure how to translate name="image_file[]" id="imageInput" type="file" multiple="true" from the html form to java so I can send the images saved in "uploadImages"-String-ArrayList to the php script.
Any suggestion/help would be very nice.
As a little addition I don't want to use any library to handle the upload process...
I think everything is just fine except it only adds one file so the mistake must be here:
for(int j=0;j<uploadImages.size();j++){
//"image_file" MUST BE THE EXACT SAME NAME AS IN PHP $_FILES['image_file']
dos.writeBytes("Content-Disposition: form-data; name=\"image_file"+String.valueOf(j)+"\"; filename=\""
+ uploadImages.get(j).substring(uploadImages.get(j).lastIndexOf("/") + 1)
+ "\""
+ end);
dos.writeBytes(end);
FileInputStream fis = new FileInputStream(uploadImages.get(j));
byte[] buffer = new byte[8192]; // 8k
int count = 0;
while ((count = fis.read(buffer)) != -1)
{
dos.write(buffer, 0, count);
}
fis.close();
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
Log.d("asdasd", "image_file"+uploadImages.get(j));
}
Ok it hasn't worked because I arranged this line wrong:
dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
Here is my working java code:
protected String doInBackground(String... args) {
String end = "\r\n";
String twoHyphens = "--";
String boundary = "******";
String result = "Ein Fehler ist aufgetreten";
String charset = "UTF-8";
String insertedReportID;
try
{
insertedReportID = args[0];
/* BEGIN - ADD LOGIN CREDENTIALS TO THE QUERY */
final String authKeyMail = "authMail";
final String authKeyPW = "authPW";
Context mContext = getContext();
SharedPreferences mPrefs = mContext.getSharedPreferences("privPrefs", Context.MODE_PRIVATE);
String email = mPrefs.getString(authKeyMail, "default");
String pw = mPrefs.getString(authKeyPW,"default");
HashMap<String, String> params = new HashMap<>();
params.put("emailadr", email);
params.put("passwrt", pw);
StringBuilder sbParams = new StringBuilder();
int i = 0;
for (String key : params.keySet()) {
try {
if (i != 0){
sbParams.append("&");
}
sbParams.append(key).append("=")
.append(URLEncoder.encode(params.get(key), charset));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
i++;
}
/* END - ADD LOGIN CREDENTIALS TO THE QUERY */
URL url = new URL(UPLOAD_URL);
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
// allow input and output
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
// use POST way
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
httpURLConnection.setRequestProperty("Charset", "UTF-8");
httpURLConnection.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
DataOutputStream dos = new DataOutputStream(
httpURLConnection.getOutputStream());
//BEGIN - ADD LOGIN CREDENTIALS TO THE UPLOADER
dos.writeBytes(twoHyphens + boundary + end);
//"emailadr" MUST BE THE EXACT SAME NAME AS IN PHP $_POST['emailadr']
dos.writeBytes("Content-Disposition: form-data; name=\"emailadr\""+ end);
dos.writeBytes(end);
dos.writeBytes(email);
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + end);
//"passwrt" MUST BE THE EXACT SAME NAME AS IN PHP $_POST['passwrt']
dos.writeBytes("Content-Disposition: form-data; name=\"passwrt\""+ end);
dos.writeBytes(end);
dos.writeBytes(pw);
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + end);
//END - ADD LOGIN CREDENTIALS TO THE UPLOADER
//"playgroundID" MUST BE THE EXACT SAME NAME AS IN PHP $_POST['equipmentID']
dos.writeBytes("Content-Disposition: form-data; name=\"reportID\""+ end);
dos.writeBytes(end);
dos.writeBytes(insertedReportID);
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + end);
//END - ADD LOGIN CREDENTIALS TO THE UPLOADER
for(int j=0;j<uploadImages.size();j++){
//"image_file" MUST BE THE EXACT SAME NAME AS IN PHP $_FILES['image_file']
dos.writeBytes("Content-Disposition: form-data; name=\"image_file[]\"; filename=\""
+ uploadImages.get(j).substring(uploadImages.get(j).lastIndexOf("/") + 1)
+ "\""
+ end);
dos.writeBytes(end);
FileInputStream fis = new FileInputStream(uploadImages.get(j));
byte[] buffer = new byte[8192]; // 8k
int count = 0;
while ((count = fis.read(buffer)) != -1)
{
dos.write(buffer, 0, count);
}
fis.close();
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + end);
}
dos.close();
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
result = br.readLine();
is.close();
httpURLConnection.disconnect();
} catch (Exception e)
{
e.printStackTrace();
}
return result;
}
I want to connect to a web-service and send a big file, i use HttpURLConnection like this:
private void doFileUpload() {
HttpURLConnection conn = null;
DataOutputStream dos = null;
DataInputStream inStream = null;
String lineEnd = "\r\n";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 8 * 1024 * 1024;
FileInputStream fileInputStream;
try {
fileInputStream = new FileInputStream(new File(getRealPathFromURI(fileUri)));
URL url = new URL("https://url.com/service.asmx?op=Method");
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("SOAPAction", SOAP_ACTION);
conn.setRequestProperty("Host", "url.com");
conn.setRequestProperty("Content-Type", "text/plain; charset=utf-8");
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + lineEnd);
dos.writeBytes("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/>"
+ lineEnd);
dos.writeBytes("<soap:Body>" + lineEnd);
dos.writeBytes("<IncluirMultimedia xmlns=/" + "www.url.es/>/" + lineEnd);
dos.writeBytes("<identificadorGUID>" + Guid + "<" + "/identificadorGUID>" + lineEnd);
dos.writeBytes("<numeroServicio>" + codigoServicio + "<" + "/numeroServicio>" + lineEnd);
dos.writeBytes("<contenido>" + ficheroAEnviar + "<" + "/contenido>" + lineEnd);
dos.writeBytes("<tipoMultimedia>" + "0" + "<" + "/tipoMultimedia>" + lineEnd);
dos.writeBytes("<coordenadaLatitud>" + "0.0" + "<" + "/coordenadaLatitud>" + lineEnd);
dos.writeBytes("<coordenadaLongitud>" + "0.0" + "<" + "/coordenadaLongitud>" + lineEnd);
dos.writeBytes("<extension>" + "mp4" + "<" + "/extension>" + lineEnd);
dos.writeBytes("<cuando>" + "0" + "<" + "/cuando>" + lineEnd);
dos.writeBytes("<IncluirMultimedia>" + lineEnd);
dos.writeBytes("</soap:Body>" + lineEnd);
dos.writeBytes("</soap:Envelope>");
buffer = new byte[8192];
bytesRead = 0;
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
dos.write(buffer, 0, bytesRead);
}
BufferedReader r = new BufferedReader(new InputStreamReader(fileInputStream));
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
total.append(line);
}
fileInputStream.close();
dos.flush();
dos.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
try {
conn.getContentLength();
if (conn.getResponseCode() >= 400) {
inStream = new DataInputStream(conn.getInputStream());
}
else {
inStream = new DataInputStream(conn.getErrorStream());
}
inStream.close();
}
catch (IOException ioex) {
Log.e("Debug", "error: " + ioex.getMessage(), ioex);
}
}
And my soap-request must be:
POST /url/url.asmx HTTP/1.1
Host: url.es
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "www.url.com/IncluirMultimedia"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<IncluirMultimedia xmlns="www.url.es">
<identificadorGUID>string</identificadorGUID>
<numeroServicio>string</numeroServicio>
<contenido>base64Binary</contenido>
<tipoMultimedia>int</tipoMultimedia>
<coordenadaLatitud>string</coordenadaLatitud>
<coordenadaLongitud>string</coordenadaLongitud>
<extension>string</extension>
<cuando>int</cuando>
</IncluirMultimedia>
</soap:Body>
</soap:Envelope>
I cant use ksoap2 because i need to send a very large file and this causes OutOfMemoryError. That's why i need to use this class.
I'm getting error 415, what am i doing wrong ?
Try using:
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
You are sending xml, I guess the server expects it.
My upload method as below:
private void upload(String Server, String FilePath, String SavePath, String NewName) {
String end = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
try {
URL url = new URL(ActionUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestMethod("POST");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Accept", "text/*");
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
ds = new DataOutputStream(con.getOutputStream());
ds.writeBytes(twoHyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data;" + "name=\"folder\"" + end + end);
ds.write(SavePath.getBytes("UTF-8"));
ds.writeBytes(end);
ds.writeBytes(twoHyphens + boundary + end);
ds.writeBytes("Content-Disposition: form-data;" + "name=\"Filedata\"; filename=\"");
ds.write(NewName.getBytes("UTF-8"));
ds.writeBytes("\"" + end);
ds.writeBytes(end);
FileInputStream fStream = new FileInputStream(uploadFile);
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int length = -1;
while((length = fStream.read(buffer)) != -1) {
ds.write(buffer, 0, length);
}
ds.writeBytes(end);
ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
fStream.close();
ds.flush();
InputStream is = con.getInputStream();
int ch;
StringBuffer b = new StringBuffer();
while((ch = is.read()) != -1) {
b.append((char)ch);
}
System.out.println("UPLOAD" + "SUCCESS");
ds.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
I found the line InputStream is = con.getInputStream(); spend most time.
But how to get the progress of it send?
Or how to modify my method to upload file "by parts"?
You can try following code,
First display a Progress Dialog Before calling your upload method,
progDailog = ProgressDialog.show(loginAct,"Process ", "please wait....",true,true);
new Thread ( new Runnable()
{
public void run()
{
// your uploading code goes here
}
}).start();
Handler progressHandler = new Handler()
{
public void handleMessage(Message msg1)
{
progDailog.dismiss();
}
}