Здравствуйте. Передо мной встала задача загрузки фото на сервер. Вот кусок инструкции
Все запросы к 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":["Не был загружен файл."]}
Типа запрос неправильный. Ковыряюсь уже второй день. Подскажите, может я не так что делаю?
Или есть методы попроще это реализовать...
Спасибо!