Почему он возвращает Внутреннюю ошибку сервера по httpUrlConnection?
Я занимаюсь разработкой приложения, которое может отправлять разные файлы на веб-сервер. Также я хочу отправлять большие файлы, для этого мне нужно разбить файлы на части. Но когда я отправляю файлы на сервер, ничего не загружается. Я не знаю, есть ли ошибка в том, как я отправляю файлы, и это дает ошибку 500 (внутренняя ошибка сервера) в моем ответе. Я не думаю, что проблема с сервером, потому что когда я загружаю файл, используя multiPartEntity работает, но когда я использую BufferedInputStream и DataOutputStream, он не работает. Пожалуйста, помогите мне и расскажите, что не так в моем коде, почему он не может отправлять мои файлы. Вот я так далеко:
String samplefile = "storage/sdcard0/Pictures/Images/picture.jpg";
File mFile = new File(samplefile);
int mychunkSize = 2048 * 1024;
final long size = mFile.length();
final long chunks = size < mychunkSize? 1: (mFile.length() / mychunkSize);
int chunkId = 0;
try {
BufferedInputStream stream = new BufferedInputStream(new FileInputStream(mFile));
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "-------------------------acebdf13572468";// random data
for (chunkId = 0; chunkId < chunks; chunkId++) {
URL url = new URL(urlString);
// Open a HTTP connection to the URL
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(20000 /* milliseconds */);
conn.setConnectTimeout(20000 /* milliseconds */);
// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
conn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
String encoded = Base64.encodeToString((_username+":"+_password).getBytes(),Base64.NO_WRAP);
conn.setRequestProperty("Authorization", "Basic "+encoded);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
DataOutputStream dos = new DataOutputStream( conn.getOutputStream() );
dos.writeBytes(twoHyphens + boundary + lineEnd);
String param1 = ""+chunkId;
String param2 = ""+chunks;
String param3 = mFile.getName();
String param4 = samplefile;
// Send parameter #file
dos.writeBytes("Content-Disposition: form-data; name=\"fieldNameHere\";filename=\"" + param3 + "\"" + lineEnd); // filename is the Name of the File to be uploaded
dos.writeBytes("Content-Type: image/jpeg" + lineEnd);
dos.writeBytes(lineEnd);
// Send parameter #chunks
dos.writeBytes("Content-Disposition: form-data; name=\"chunk\"" + lineEnd);
dos.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
dos.writeBytes("Content-Length: " + param2.length() + lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes(param2 + lineEnd);
dos.writeBytes(twoHyphens + boundary + lineEnd);
// Send parameter #name
dos.writeBytes("Content-Disposition: form-data; name=\"name\"" + lineEnd);
dos.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);
dos.writeBytes("Content-Length: " + param3.length() + lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes(param3 + lineEnd);
dos.writeBytes(twoHyphens + boundary + lineEnd);
byte[] buffer = new byte[mychunkSize];
stream.read(buffer);
dos.write(buffer);
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
dos.flush();
dos.close();
}
} catch (Exception e) {
Log.e("Error Uploading Files", e.toString());
}
2 ответа
Вы можете использовать этот код. Это класс J2ME для обработки загрузки файлов через HTTP POST Multipart Requests.
Надеюсь это поможет.
Если вы предпочитаете, вы можете использовать эту библиотеку. Его очень легко реализовать и дозировать всю необходимую вам работу.