Как загрузить файл с предварительно подписанным URL-адресом в хранилище объектов minio с помощью Java-клиента Api?

Я хочу загрузить файл в хранилище объектов minio, которое создало предварительно подписанный URL-адрес с помощью клиентского API Java.

В документация относится только к созданию предварительно подписанного URL-адреса или созданию некоторых из них. Есть ли возможность загрузки с использованием предварительно подписанного URL-адреса.


person A.Dumas    schedule 19.11.2019    source источник


Ответы (1)


Я думаю, что вы, вероятно, уже получили ответ, поместите его здесь для других, которые могли наткнуться на подобную задачу.

Существует несколько различных HTTP-клиентов, которые можно использовать в JAVA, поэтому реализации могут различаться. Идея состоит в том, что как только вы получите URL-адрес, нужно просто отправить запрос HTTP PUT, используя URL-адрес с двоичным содержимым файла, как вы делаете в любой процедуре загрузки файла. Насколько я знаю, вы не можете напрямую отправлять составные данные файла, используя PUT, вы должны отправлять двоичный поток.

Вот пример загрузки файла jpeg с OkHttpClient:

OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("image/jpeg");
RequestBody body = RequestBody.create(mediaType, "<file contents here>");
Request request = new Request.Builder()
  .url("<minio presigned url here>")
  .method("PUT", body)
  .addHeader("Content-Type", "image/jpeg")
  .build();
Response response = client.newCall(request).execute();

Другой пример со Spring RestTemplate, где входящий запрос к контроллеру — это MultipartFile. Если это объект File, вы можете использовать свой любимый служебный метод, такой как byte[] org.apache.commons.io.FileUtils.readFileToByteArray(File file), чтобы получить массив байтов из этого файла.

HttpHeaders headers = new HttpHeaders();
HttpEntity<byte[]> entity = new HttpEntity<>(multipartFile.getBytes(), headers);
restTemplate.exchange(new URI("<presignedUrl>"),
                org.springframework.http.HttpMethod.PUT, entity, Void.class);

Вы можете искать свой конкретный HTTP-клиент, просто нужно искать «Загрузка файла RESTful с запросом PUT» или что-то подобное.

person Zobayer Hasan    schedule 22.04.2020