J'ai besoin de télécharger Arraylist
des images sur le serveur sans utiliser de bibliothèque. J'utilise Asynctask
pour télécharger une seule image et cela fonctionne parfaitement avec l'aide de httpurlconnection multipart / form-data. Maintenant, je dois changer mon code pour télécharger plusieurs fichiers de tout type en utilisant, Arraylist<String>
mais mon problème est que le code existant FileinputStream
ne prend pas en charge la liste d'array et je ne sais pas quoi utiliser au lieu de Fileinputstream
télécharger la liste d'arrayl vers le serveur et je ne le fais pas souhaitez utiliser n'importe quelle bibliothèque pour cela non plus.
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;
}
}
J'ai également essayé de mettre FileInputStream
en boucle, mais le téléchargement d'images en plusieurs demandes n'est pas ce que je veux. Mon serveur requiert l'application pour faire une seule demande pour n nombre d'images. Toute aide serait appréciée mais sans utiliser de bibliothèque
Réponses:
REMARQUE que je n'ai pas essayé si ce code fonctionne effectivement avec HttpURLConnection mais il devrait.
D'après ce que j'ai lu sur Internet, vous pouvez toujours utiliser la boucle que vous avez mentionnée, mais avec quelques modifications.
J'ai suivi le didacticiel sur les parties multiples / les données de formulaire ici dev.to , pour en faire plus un poste d'apprentissage, je vais vous dire quelle est cette méthode qui devrait se produire.
Le multipart / form-data est envoyé comme ceci
Ce que je ferais, c'est de créer une nouvelle méthode mais vous pouvez simplement écrire le code dans votre méthode déjà existante.
Vous voulez écrire est la frontière suivie de la disposition puis des données . Faites cela pour tous les fichiers, puis vous envoyez la limite de fermeture . Cela générera la structure multipart / form-data que vous souhaitez.
En psudo-code, ce serait
Le code pourrait être écrit comme ceci, d'abord vous définissez vos variables
Voici où les données seront générées. Il commence par concaténer la frontière puis lire les données. Ces données sont écrites dans le flux et vous continuez la boucle pour tous les fichiers / images.
Maintenant, le tableau d'octets
sendData
contiendra les données multipart / form que vous devez envoyer avec votre HttpURLConnection.Je ne suis pas si actif ici depuis longtemps. Dites-moi si vous avez besoin de plus de spécifications ou que je clarifie mon texte: D
la source
FileinputStream ne prend pas en charge ArrayList. Mais il existe un moyen de contourner le problème en utilisant ObjectOutputStream . Il sérialisera également votre ArrayList. Vérifiez les modifications dans le code.
Happy Coding :)
la source
Je ne sais pas si l'utilisation d'une seule tâche asynchrone est un must pour vous.
Comme vous l'avez dit, votre code fonctionne parfaitement pour une seule image. Donc, pour télécharger plusieurs fichiers depuis arraylist, vous devez simplement modifier un peu votre AsyncTask. Téléchargez simplement un fichier après l'autre Ou si vous ne voulez même pas faire autant de modifications, déclarez simplement la variable globale contenant l'index de l'élément en cours de téléchargement et dans OnPostExecute, créez une nouvelle instance de la tâche asynchrone et passez l'élément suivant dans la liste. J'espère que c'est clair.
la source