简体   繁体   中英

Using HttpPost to upload file Android

am I uploading this file right? Here is my code:


Deleted Code

it is basically just a async task that sends the file (csv) to the web server.

I am getting back status code 400:( Anyone know what I am doing wrong?


Edit: Now I am getting back status code 411, but when I specify the content-length it comes back with ClientProtocolException.

Here's my code now:

UploadTask uploadtask;

    public class UploadTask extends AsyncTask<Void, byte[], Boolean> {

        HttpPost httppost;

        @Override
        protected Boolean doInBackground(Void... params) {
            Boolean result = false;
            String id = projectIDs.get((int) spinner.getSelectedItemId());

            Log.i("TAG", id);
            try {

                l(send(String.valueOf(id), "http://" + site
                        + "/restlet/position.csv?project=" + id,
                        "/csv.csv"));

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return result;
        }

        private void entity(String id, String file) throws JSONException,
                UnsupportedEncodingException, FileNotFoundException {
            // Add your data
            File myFile = new File(Environment.getExternalStorageDirectory(),
                    file);

            FileEntity fileEntity = new FileEntity(myFile, "multipart/form-data;");
            fileEntity.setChunked(true);
            long len = fileEntity.getContentLength();
            httppost.getParams().setParameter("project", id);
            httppost.setEntity(fileEntity);

            //httppost.addHeader("Content-Length",String.valueOf(len));
            httppost.setHeader("Content-Length", String.valueOf(len));
        }

        private String send(String id, String URL, String file)
                throws ClientProtocolException, IOException, JSONException {

            l(URL);

            HttpResponse response = null;

            httppost = new HttpPost(URL);

            entity(id, file);

            response = httpclient.execute(httppost);

            Header[] head = response.getAllHeaders();

            String str = String.valueOf(response.getStatusLine()
                    .getStatusCode());

            response.getEntity().consumeContent();

            return str;
        }

    }

This code here worked for uploading a file to the web server:) After many hours of struggle I got it, had to import MultipartEntity, StringBody and FileBody from apache however

httppost = new HttpPost(URL);
MultipartEntity entity = new MultipartEntity();
entity.addPart("title", new StringBody("position.csv", Charset.forName("UTF-8")));
File myFile = new File(Environment.getExternalStorageDirectory(), file);
FileBody fileBody = new FileBody(myFile);
entity.addPart("file", fileBody);
httppost.setEntity(entity);
httppost.getParams().setParameter("project", id);

Before any thing

1- to select file use this or select it by anyway

https://github.com/iPaulPro/aFileChooser just import it

2- Don't forget to add this to manifest

   <\uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.RECORD_AUDIO" />

3- Don't forget to change the uri in java code and the folder name in php code

4- Just copy and past this code and will work i tried it and working 100%

Java

package com.example.uploadthestupidfile;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import com.ipaulpro.afilechooser.utils.FileUtils;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

@SuppressLint("NewApi")
public class MainActivity extends Activity
  {
private static final int FILE_SELECT_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
      Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
        intent.setType("*/*"); 
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        try {
            startActivityForResult(
                    Intent.createChooser(intent, "Select a File to Upload"),
                    FILE_SELECT_CODE);
        } catch (android.content.ActivityNotFoundException ex) {
            // Potentially direct the user to the Market with a Dialog
            Toast.makeText(this, "Please install a File Manager.", 
                    Toast.LENGTH_SHORT).show();
        }

}

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)    {
    switch (requestCode) {
        case FILE_SELECT_CODE:
        if (resultCode == RESULT_OK) {
            // Get the Uri of the selected file 
            Uri uri = data.getData();
          //  Log.d(TAG, "File Uri: " + uri.toString());
            // Get the path
            String path = FileUtils.getPath(this, uri);

            Toast.makeText(this,""+path,Toast.LENGTH_LONG).show();

            try {
                upload(path);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Toast.makeText(this,"ErrorS",Toast.LENGTH_LONG).show();
            }
        //    Log.d(TAG, "File Path: " + path);
            // Get the file instance
            // File file = new File(path);
            // Initiate the upload
        }
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}
 public void upload(String selectedPath) throws Exception {

        HttpURLConnection connection = null;
        DataOutputStream outputStream = null;
        DataInputStream inputStream = null;

        String pathToOurFile = selectedPath;
        String urlServer = "http://yoursite/upload_files.php";
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";

        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024;

            FileInputStream fileInputStream = new FileInputStream(new File(
                    pathToOurFile));

            URL url = new URL(urlServer);
            connection = (HttpURLConnection) url.openConnection();

            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setUseCaches(false);

            connection.setRequestMethod("POST");

            connection.setRequestProperty("Connection", "Keep-Alive");
            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=\"uploadedfile\";filename=\""
                            + pathToOurFile + "\"" + lineEnd);
            outputStream.writeBytes(lineEnd);

            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];

            bytesRead = fileInputStream.read(buffer, 0, bufferSize);

            while (bytesRead > 0) {
                outputStream.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            }

            outputStream.writeBytes(lineEnd);
            outputStream.writeBytes(twoHyphens + boundary + twoHyphens
                    + lineEnd);

            int serverResponseCode = connection.getResponseCode();
            String serverResponseMessage = connection.getResponseMessage();

            fileInputStream.close();
            outputStream.flush();
            outputStream.close();

    }

}

PHP upload_files.php

 <?php
$target_path = "uploadedimages/"; //here folder name 
$target_path = $target_path . basename($_FILES['uploadedfile']['name']);

error_log("Upload File >>" . $target_path . $_FILES['error'] . " \r\n", 3,
"Log.log");

error_log("Upload File >>" . basename($_FILES['uploadedfile']['name']) . "     \r\n",
3, "Log.log");

 if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "The file " . basename($_FILES['uploadedfile']['name']) .
   " has been uploaded";
   } else {
  echo "There was an error uploading the file, please try again!";
  }
 ?>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM