Загрузка изображения на сервер — Android

У меня есть ссылка на Rest Api и пример кода для загрузки изображения в C Sharp, но как загрузить изображение на сервер с Android то же самое, используя java

Вот этот пример кода

http://xx.xx.xxx.xx/restservice/photos

Sample code for uploading file:
 string requestUrl = string.Format("{0}/UploadPhoto/{1}", url,filnm);
//file name should be uniqque
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl);
                request.Method = "POST";
                request.ContentType = "text/plain";
                byte[] fileToSend = FileUpload1.FileBytes; //File bytes
                request.ContentLength = fileToSend.Length;

                using (Stream requestStream = request.GetRequestStream())
                {
                    // Send the file as body request.
                    requestStream.Write(fileToSend, 0, fileToSend.Length);
                    requestStream.Close();
                }

                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    Console.WriteLine("HTTP/{0} {1} {2}", response.ProtocolVersion, (int)response.StatusCode, response.StatusDescription);

как ты это сделаешь с андроидом

ОТРЕДАКТИРОВАНО:

С помощью вашего ответа я написал код здесь, но я получаю ответ соединения 404 и ОШИБКУ ОШИБКИ

    public class ImageUploadToServer extends Activity {

    TextView messageText;
    Button uploadButton;

    String upLoadServerUri = null;
    String urlLink = "http://xx.xx.xxx.xx/restservice/photos/";
    String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/myimg.jpg";

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_upload_to_server);

        uploadButton = (Button)findViewById(R.id.uploadButton);
        messageText  = (TextView)findViewById(R.id.messageText);
        uploadData();

    }

    public void uploadData ()
    {

        HttpURLConnection connection = null;
        DataOutputStream outputStream = null;  
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024; 

        try {
            // FileInputStream fileInputStream = new FileInputStream(new File(path));

             File sourceFile = new File(path); 

             FileInputStream fileInputStream = new FileInputStream(sourceFile);

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

             Log.d("Connection:", "Connection" + connection.getResponseCode());

             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=\""
                             + path + "\"" + 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);

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

             InputStream responseStream = new BufferedInputStream(connection.getInputStream());

             BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream));
             String line = "";
             StringBuilder stringBuilder = new StringBuilder();
             while ((line = responseStreamReader.readLine()) != null) {
                 stringBuilder.append(line).append("\n");
             }
             responseStreamReader.close();

             String response = stringBuilder.toString();
             Log.w("SERVER RESPONE: ", "Server Respone" + response);

             responseStream.close();
             connection.disconnect();

         } catch (Exception ex) {
             Log.i("UPLOAD ERROR", "ERROR ERROR");
         }

    }


}

person user1169079    schedule 22.02.2014    source источник
comment
У вас есть решение??   -  person Pranita    schedule 08.07.2017


Ответы (3)


В настоящее время я использую этот код для загрузки небольших видео на сервер (на стороне сервера PHP).

Не думайте, что apache HttpClient больше не поддерживается, поэтому HttpURLConnection — это то, что вам нужно.

    try {
        FileInputStream fileInputStream = new FileInputStream(new File(
                path));

        URL url = new URL(urlLink);
        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=\""
                        + path + "\"" + 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);

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

        InputStream responseStream = new BufferedInputStream(connection.getInputStream());

        BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream));
        String line = "";
        StringBuilder stringBuilder = new StringBuilder();
        while ((line = responseStreamReader.readLine()) != null) {
            stringBuilder.append(line).append("\n");
        }
        responseStreamReader.close();

        String response = stringBuilder.toString();
        Log.w("SERVER RESPONE: ", response);

        responseStream.close();
        connection.disconnect();

    } catch (Exception ex) {
        Log.i("UPLOAD ERROR", "ERROR ERROR");
    }
}
person Jesson Atherton    schedule 22.02.2014
comment
Джессон, я отредактировал свой вопрос с помощью вашего кода, он дает мне код ответа 404 и выходит в исключение ОШИБКА ОШИБКА, что с ним не так, где я ошибаюсь? - person user1169079; 23.02.2014
comment
Проверьте правильность пути к вашему файлу. И вам нужно будет запустить код в asyncTask. Android не позволит вам выполнять длительные операции в потоке пользовательского интерфейса. - person Jesson Atherton; 24.02.2014
comment
Я получаю ту же проблему, что и user1201239 - person Pranita; 08.07.2017

вот PHP, который может помочь вам получить файл на вашем сервере.

<?php

try {


    // Checking for upload attack and rendering invalid.
    if (
        !isset($_FILES['uploadedfile']['error']) ||
        is_array($_FILES['uploadedfile']['error'])
    ) {
        throw new RuntimeException('Invalid parameters.');
    }

    // checking for error value on upload
    switch ($_FILES['uploadedfile']['error']) {
        case UPLOAD_ERR_OK:
            break;
        case UPLOAD_ERR_NO_FILE:
            throw new RuntimeException('No file sent.');
        case UPLOAD_ERR_INI_SIZE:
        case UPLOAD_ERR_FORM_SIZE:
            throw new RuntimeException('Exceeded filesize limit.');
        default:
            throw new RuntimeException('Unknown errors.');
    }

    // checking file size 
    if ($_FILES['uploadedfile']['size'] > 1000000) {
        throw new RuntimeException('Exceeded filesize limit.');
    }


    // checking MIME type for mp4... change this to suit your needs
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    if (false === $ext = array_search(
        $finfo->file($_FILES['uploadedfile']['tmp_name']),
        array(
            'mp4' => 'video/mp4',
        ),
        true
    )) {
        throw new RuntimeException('Invalid file format.');
    }


    // Uniquely naming each uploaded for file
    if (!move_uploaded_file(
        $_FILES['uploadedfile']['tmp_name'],
        sprintf('./uploads/%s.%s',
            sha1_file($_FILES['uploadedfile']['tmp_name']),
            $ext
        )
    )) {
        throw new RuntimeException('Failed to move uploaded file.');
    }
    // response code.
    echo 'File is uploaded successfully!';

}
catch (RuntimeException $e) {

    echo $e->getMessage();

}

?>
person Jesson Atherton    schedule 23.02.2014

попробуй это....

public static JSONObject postFile(String url,String filePath,int id){

String result="";
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);

File file = new File(filePath);
MultipartEntity mpEntity = new MultipartEntity();
ContentBody cbFile = new FileBody(file, "image/jpeg");

StringBody stringBody= null;
JSONObject responseObject=null;

try {
    stringBody = new StringBody(id+"");
    mpEntity.addPart("file", cbFile);
    mpEntity.addPart("id",stringBody);
    httpPost.setEntity(mpEntity);
    System.out.println("executing request " + httpPost.getRequestLine());
    HttpResponse response = httpClient.execute(httpPost);
    HttpEntity resEntity = response.getEntity();
    result=resEntity.toString();
    responseObject=new JSONObject(result);
} 
catch (UnsupportedEncodingException e) {
    e.printStackTrace();
} 
catch (ClientProtocolException e) {
    e.printStackTrace();
} 
catch (IOException e) {
    e.printStackTrace();
} 
catch (JSONException e) {
    e.printStackTrace();
}
return responseObject;
}
person yosef abu rabeaa    schedule 22.08.2016