Мне нужно загрузить Arraylist
изображения на сервер без использования какой-либо библиотеки. Я использую Asynctask
для загрузки одного изображения, и он отлично работает с помощью httpurlconnection multipart / form-data. Теперь мне нужно изменить свой код, чтобы загрузить несколько файлов любого типа с помощью, Arraylist<String>
но моя проблема в том, что существующий код FileinputStream
не поддерживает arraylist, и я не представляю, что использовать вместо Fileinputstream
загрузки arraylist на сервер, и я не хочу использовать любую библиотеку для этого либо.
public class multipart_test extends AsyncTask<Void,Void,String> {
Context context;
String Images;
public static final String TAG = "###Image Uploading###";
public multipart_test(Context context,String Upload_Images) {
this.context = context;
this.Images = Upload_Images;
}
@Override
protected String doInBackground(Void... params) {
BufferedReader reader;
String WebPath = null;
try {
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1024 * 1024;
//todo change URL as per client ( MOST IMPORTANT )
URL url = new URL("10.0.0.1/uploadMultipart.php");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs.
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Set HTTP method to POST.
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
FileInputStream fileInputStream;
DataOutputStream outputStream;
outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"reference\""+ lineEnd);
outputStream.writeBytes(lineEnd);
//outputStream.writeBytes("my_refrence_text");
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadFile\";filename=\"" + "profileImage" +"\"" + lineEnd);
outputStream.writeBytes(lineEnd);
//Dummy ArrayList for upload
ArrayList<String> uploadFiles = new ArrayList<>();
uploadFiles.add(Images);
uploadFiles.add(Images);
uploadFiles.add(Images);
uploadFiles.add(Images);
fileInputStream = new FileInputStream(uploadFiles); // NOT SUPPORTING ARRAYLIST HERE
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
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();
}
// Responses from the server (code and message)
int serverResponseCode = connection.getResponseCode();
String result = null;
if (serverResponseCode == 200) {
StringBuilder s_buffer = new StringBuilder();
InputStream is = new BufferedInputStream(connection.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String inputLine;
while ((inputLine = br.readLine()) != null) {
s_buffer.append(inputLine);
}
result = s_buffer.toString();
}
connection.getInputStream().close();
outputStream.flush();
outputStream.close();
if (result != null) {
Log.d("result_for upload", result);
}
return WebPath;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
Я также пытался FileInputStream
зациклить, но загрузка изображений в несколько запросов не то, что я хочу. Мой сервер требует, чтобы приложение делало один запрос на n изображений. Любая помощь будет полезна, но без использования какой-либо библиотеки
Ответы:
Обратите внимание, что я не пробовал, если этот код действительно работает с HttpURLConnection, но он должен.
Из того, что я прочитал из интернета, вы все еще можете использовать тот цикл, который вы упомянули, но с некоторыми изменениями.
Я следовал руководству по multipart / form-data здесь dev.to , чтобы сделать это больше учебным постом, я расскажу вам, что это за метод, что должно произойти.
Данные multipart / form отправляются следующим образом
Я хотел бы создать новый метод, но вы можете просто написать код в уже существующем методе.
Вы хотите написать это граница, за которой следует расположение, а затем данные . Сделайте это для всех файлов, а затем отправьте закрывающую границу . Это сгенерирует нужную вам структуру multipart / form-data .
В псевдокоде это будет
Код может быть написан так, сначала вы определяете свои переменные
Здесь данные будут генерироваться. Он начинается с конкатенации границы и последующего чтения данных. Эти данные записываются в поток, и вы продолжаете цикл для всех файлов / изображений.
Теперь байтовый массив
sendData
будет содержать данные multipart / form, которые вам нужно отправить с помощью HttpURLConnection.Я не был так активен здесь в течение долгого времени. Скажите, если вам нужна дополнительная спецификация или я уточню свой текст: D
источник
FileinputStream не поддерживает ArrayList. Но есть способ обойти использование ObjectOutputStream . Он также будет сериализовать ваш ArrayList. Проверьте изменения в коде.
Удачного кодирования :)
источник
Не уверен, что использование одной асинхронной задачи является обязательным для вас.
Как вы сказали, ваш код работает абсолютно нормально для одного изображения. Поэтому для загрузки нескольких файлов из arraylist вам просто нужно немного изменить AsyncTask. Просто загружайте один файл за другим. Или, если вы даже не хотите вносить много изменений, просто объявите глобальную переменную, содержащую индекс загружаемого элемента, и в OnPostExecute создайте новый экземпляр асинхронной задачи и передайте следующий элемент в массив. Надеюсь, это понятно.
источник