Я попытался загрузить большой файл на сервер (максимальный поддерживаемый размер файла составляет 128 МБ). Если я правильно понял, сервер может получать большие файлы (например, 500 МБ), но только если эти файлы отправляются в чанках .
Я написал метод ниже и ожидал, что он загрузит видео файлы в chunks на сервер. Тем не менее, я получаю следующую ошибку с сервера:
413 Запрос слишком большой.
Ниже приведен мой метод:
public static void uploadFile(Context context, Uri videoUri, String fileName, File file) throws FileNotFoundException {
int CHUNK_SIZE = 2048;
ContentResolver contentResolver = context.getContentResolver();
final String contentType = contentResolver.getType(videoUri);
final AssetFileDescriptor fd = contentResolver.openAssetFileDescriptor(videoUri, "r");
if (fd == null) {
try {
throw new FileNotFoundException("could not open file descriptor");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
RequestBody videoFile = new RequestBody() {
@Override
public long contentLength() {
return fd.getDeclaredLength();
}
@Override
public MediaType contentType() {
return MediaType.parse(contentType);
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
Source source = null;
try {
source = Okio.source(file);
long total = 0;
long read;
while ((read = source.read(sink.buffer(), CHUNK_SIZE)) != -1) {
total += read;
sink.flush();
Log.e("progress", String.valueOf(total/100/100/100));
//this.listener.transferred(total);
}
} finally {
Util.closeQuietly(source);
}
}
};
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("video/*", fileName, videoFile)
.build();
Request request = new Request.Builder()
.url("https://test.ua/api/upload")
.post(requestBody)
.header("Authorization", Utils.getHeaderToken())
.build();
OkHttpClient client = new OkHttpClient.Builder().build();
client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Call call, IOException e) {
try {
fd.close();
} catch (IOException ex) {
e.addSuppressed(ex);
}
Log.e("asdasd", "failed", e);
}
@Override public void onResponse(Call call, Response response) throws IOException {
Log.e("success", String.valueOf(response.code()));
InputStream in = response.body().byteStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String result, line = reader.readLine();
result = line;
while((line = reader.readLine()) != null) {
result += line;
}
Log.e("success", String.valueOf(result));
fd.close();
}
});
}
UPD:
сервер использует laravel-chunk-upload , и у них есть эти настройки во внешнем интерфейсе:
dropzoneOptions: {
url: '/upload',
dictDefaultMessage: 'Click here',
chunksUploaded: function (file, done) {
done()
},
thumbnailWidth: 150,
maxFilesize: 250,
chunking: false,
chunkSize: 1000000, // Bytes
required: true,
maxFiles: 1,
acceptedFiles: 'video/*',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
},