@niklas1987

Как отправить фото используя условия API?

Здравствуйте. Передо мной встала задача загрузки фото на сервер. Вот кусок инструкции

Все запросы к API должны иметь заголовок Content-Type: application/json, кроме запросов, где загружаются файлы, так как там используем "multipart/form-data".

Добавление фото в профиль
POST 254.254.254.254/accounts/profile/add_photo

Максимальный размер фото 4МБ.

Загрузку фото делаю через класс AsyncTask нижеприведенным кодом:

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Task_finder extends AsyncTask<Void, Void, Void> {

    File file;

    String token;


    public Task_finder(File file, String token){
        this.file = file;
        this.token = token;
        Log.d("responseAPI", "sp.token = " + token);
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        if(token.equals("")){
            Log.d("responseAPI", "sp.token = \"\"");
            return null;
        }
        String result = null;
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        String existingFileName = file.getAbsolutePath();
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary =  "*****" + System.currentTimeMillis();
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1*1024*1024;
        String urlString = "http://254.254.254.254/accounts/profile/add_photo/";
        try{
            FileInputStream fileInputStream = new FileInputStream(new File(existingFileName) );
            URL url = new URL(urlString);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
            conn.setRequestProperty("Authorization", "Token " + token);
            dos = new DataOutputStream( conn.getOutputStream() );
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            String t = "Content-Disposition: form-data; name=\"image\";filename=\"" + file.getName() + "\"" + lineEnd;
            Log.d("responseAPI", "t = " + t);
            dos.writeBytes(t); // uploaded_file_name is the Name of the File to be uploaded
            dos.writeBytes("Content-Type: image upload" + lineEnd);
            dos.writeBytes(lineEnd);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            while (bytesRead > 0){
                dos.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            }
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

            int serverResponseCode = conn.getResponseCode();

            fileInputStream.close();
            dos.flush();
            dos.close();
            if(serverResponseCode == 200) {
                result = readStream(conn.getInputStream());
            } else {
                result = readStream(conn.getErrorStream());
            }
            Log.e("responseAPI", "result = " + result);
        } catch (IOException ioe){
            Log.e("Debug", "error: " + ioe.getMessage(), ioe);
        }
        //------------------ read the SERVER RESPONSE
        try {
            int i = conn.getResponseCode();
            Log.e("responseAPI","responseCode = "+i);
        }
        catch (IOException ioex){
            Log.e("Debug", "error: " + ioex.getMessage(), ioex);
        }
        return null;
    }

    public static String readStream(InputStream inputStream) throws IOException {
        StringBuffer buffer = new StringBuffer();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }

        return buffer.toString();
    }

    @Override
    protected void onPostExecute(Void result) {
    }
}


Вызов этого класса делаю следующим образом:

Task_finder task = new Task_finder(new File(filePath), "8asd9d8as9das09af998" /*this is token*/);
                    task.execute();


В результате получаю ответ от сервера:
responseCode = 400
result = {"image":["Не был загружен файл."]}


Типа запрос неправильный. Ковыряюсь уже второй день. Подскажите, может я не так что делаю?
Или есть методы попроще это реализовать...
Спасибо!
  • Вопрос задан
  • 612 просмотров
Решения вопроса 1
Задуматься о смысле бытия, перестать использовать асинктакс использовать retrofit вот так

или же оставить все как есть, но все равно использовать retrofit но с синхронным вызовом (возвращаемый тип у первого метода из ссылки выше вот так)
и вызвать это все в теле doInBackground
Заголовки ретровит сам нормально подставит)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы