Devo consentire a un utente di caricare più file (può essere immagine/video/audio) in una singola richiesta dalla mia applicazione Android al server PHP. Sto usando il servizio web REST.Android consente il caricamento di più file (Max 150 MB) al server PHP
Per questa funzionalità, Sto usando il seguente codice:
/* To upload the multiple documents */
public void uploadFile() {
String charset = "UTF-8";
File[] uploadFileArray = new File[mediaList.size()];
for (int i = 0; i < mediaList.size(); i++) {
uploadFileArray[i] = new File(mediaList.get(i).getMediaPath());
}
try {
MultipartUtility multipart = new MultipartUtility(upLoadServerUri, charset);
for (int i = 0; i < mediaList.size(); i++) {
if (isImage)) {
multipart.addFilePart("image_doc[]", uploadFileArray[i]);
}
else if (isVideo) {
multipart.addFilePart("video_doc[]", uploadFileArray[i]);
}
else if (isAudio) {
multipart.addFilePart("audio_doc[]", uploadFileArray[i]);
}
}
List<String> responseUploadDocument = multipart.finish();
System.out.println("SERVER REPLIED:");
for (String line : responseUploadDocument) {
System.out.println(line);
responseUploadDocumentString = line;
}
if (responseUploadDocumentString != null) {
JSONObject jsonObj = new JSONObject(responseUploadDocumentString);
statusUploadDoc = jsonObj.getString("status");
}
} catch (Exception e) {
e.printStackTrace();
}
}
E la mia classe MultipartUtility è la seguente:
public class MultipartUtility {
private final String boundary;
private static final String LINE_FEED = "\r\n";
private HttpURLConnection httpConn;
private String charset;
private OutputStream outputStream;
private PrintWriter writer;
public MultipartUtility(String requestURL, String charset)
throws IOException {
this.charset = charset;
boundary = "===" + System.currentTimeMillis() + "===";
URL url = new URL(requestURL);
httpConn = (HttpURLConnection) url.openConnection();
***httpConn.setChunkedStreamingMode(0);***
httpConn.setUseCaches(false);
httpConn.setDoOutput(true); // indicates POST method
httpConn.setDoInput(true);
httpConn.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + boundary);
httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
httpConn.setRequestProperty("Test", "Bonjour");
outputStream = httpConn.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
true);
}
public void addFormField(String name, String value) {
writer.append("--" + boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
.append(LINE_FEED);
writer.append("Content-Type: text/plain; charset=" + charset).append(
LINE_FEED);
writer.append(LINE_FEED);
writer.append(value).append(LINE_FEED);
writer.flush();
}
public void addFilePart(String fieldName, File uploadFile)
throws IOException {
String fileName = uploadFile.getName();
writer.append("--" + boundary).append(LINE_FEED);
writer.append(
"Content-Disposition: form-data; name=\"" + fieldName
+ "\"; filename=\"" + fileName + "\"")
.append(LINE_FEED);
writer.append(
"Content-Type: "
+ URLConnection.guessContentTypeFromName(fileName))
.append(LINE_FEED);
writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
writer.append(LINE_FEED);
writer.flush();
FileInputStream inputStream = new FileInputStream(uploadFile);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
inputStream.close();
writer.append(LINE_FEED);
writer.flush();
}
public void addHeaderField(String name, String value) {
writer.append(name + ": " + value).append(LINE_FEED);
writer.flush();
}
public List<String> finish() throws IOException {
List<String> response = new ArrayList<String>();
writer.append(LINE_FEED).flush();
writer.append("--" + boundary + "--").append(LINE_FEED);
writer.close();
// checks server's status code first
int status = httpConn.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpConn.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
response.add(line);
}
reader.close();
httpConn.disconnect();
} else {
throw new IOException("Server returned non-OK status: " + status);
}
return response;
}
}
Ma ora il problema è:
Sul server locale :
- Consentire a caricare fino a 16 MB [se setChunkedStremmingMode (0) non è impostato]
- permettono di caricare fino a 150 MB [se setChunkedStremmingMode (0) è impostato]
In diretta Server:
- permettono di caricare fino a 16MB [se setChunkedStremmingMode (0) non è impostato]
- Disallow per caricare un singolo file KB [se setChunkedStremmingMode (0) è impostato]
mio sia loc tutti i server live hanno le stesse configurazioni. Non capisco perché setChunkedStremmingMode (0) non funzioni per il server live.
plz dare il tuo contributo se il problema è risolto, in caso contrario, dare un feedback che cosa è un problema. – DearDhruv