Загрузить большой файл на сервер Android - PullRequest
0 голосов
/ 12 сентября 2018

Я попытался загрузить большой файл на сервер (максимальный поддерживаемый размер файла составляет 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')
                   }
               },
...