загрузка файлов PDF и изображений с помощью дооснащения

#android #retrofit

Вопрос:

мое мобильное приложение загружает PDF-файлы и файлы изображений на сервер. Я мог бы загружать файлы изображений, используя приведенный ниже код.

Определение API

 @Multipart
@POST("/api/images/upload")
Call<ImageUploadResponse> uploadImage(@Header("x-auth-token") String authHeader, @Part List<MultipartBody.Part> image);

 

при выборе любого файла изображения из хранилища

 if (requestCode == SELECT_FILE){
 if (data.getClipData() != null) {
   List<byte[]> imageDataList = new ArrayList<>();
   int count = data.getClipData().getItemCount();
   for (int i = 0; i < count; i  ) {
     try {
        bmp = MediaStore.Images.Media.getBitmap(getActivity().getApplicationContext().getContentResolver(),imageUri);
        bmp.compress(Bitmap.CompressFormat.JPEG, 10, baos);
        imageDataList.add(baos.toByteArray());
      } catch (Exception e) {
       e.printStackTrace();
      }
   }
    uploadImage(imageDataList);
 }
 

запрос на сборку нескольких частей тела.

 private void uploadImage( List<byte[]> imageDataList) {
              
     MultipartBody.Part[]  parts =  new MultipartBody.Part[imageDataList.size()];
     for (int i = 0; i < imageDataList.size(); i  ) {
          RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpeg"), imageDataList.get(i));
          String fileName = "image"   i   ".jpg";
          MultipartBody.Part body = MultipartBody.Part.createFormData("image", fileName, requestFile);
          parts[i] = body;
  }
 String token = sessionCache.getToken();
 Call<ImageUploadResponse> call = apiInterface.uploadImage(token,parts);
        
 call.enqueue(new Callback<ImageUploadResponse>() {
      @Override
      public void onResponse(Call<ImageUploadResponse> call, Response<ImageUploadResponse> response) {
            List<String> pdfPaths = response.body().getPdf();
            List<String> imagePaths = response.body().getImg();
            Toast.makeText(getContext(), "image scanned/attached",
                                Toast.LENGTH_LONG).show();
           }
        
     @Override
     public void onFailure(Call<ImageUploadResponse> call, Throwablet) {
        
      }
       });
}
 

Как я могу загрузить pdf-файл?
Я изо всех сил пытаюсь получить абсолютный путь к pdf-файлу из URI

Комментарии:

1. Сначала загрузите файлы изображений, используя полученный uri и не используя промежуточное растровое изображение. Когда вы будете готовы, вы можете использовать тот же код для загрузки pdf-файла. Или любой другой файл.

2. И вам не нужен путь для загрузки файла, если у вас хороший uri.

3. bmp=хранилище сред. Изображения. Media.getBitmap(getActivity().getApplicationContext().getContentResolver(),imageUri); возвращает значение null для файла pdf. Я работаю над файлом изображения

4. Да, конечно, он возвращает значение null для pdf. Файл pdf — это не файл изображения. Похоже, вы не читали мои комментарии.

5. Ну, вы можете обрабатывать файлы в массивах байтов: ` imageDataList.add(baos. toByteArray());` Итак, поместите байты вашего pdf-файла в массив байтов, а затем добавьте этот массив байтов.

Ответ №1:

openInputStream(uri) для получения входного потока и преобразования входного потока в массив байтов решил проблему для изображений и pdf. получите тип mime из ClipData и используйте тот же тип mime при построении тела запроса.

  @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
  ..............
  ..............
  if (requestCode == SELECT_FILE) {
    if (data.getClipData() != null) {
        List<byte[]> imageDataList = new ArrayList<>();
        int count = data.getClipData().getItemCount(); 
        String mimeType = data.getClipData().getDescription().getMimeType(0);
        for (int i = 0; i < count; i  ) {
           Uri imageUri = data.getClipData().getItemAt(i).getUri();
           imageDataList.add(getBytes(imageUri));
        }
       // pass the byte array list to be uploaded.
       handleAttachment(imageDataList, mimeType);
     }
}


private byte[] getBytes(Uri uri) {
   try {
      InputStream inputStream = getActivity()
                   .getApplicationContext().getContentResolver().openInputStream(uri);
            return readBytes(inputStream);

        } catch (Exception ex) {
            LOG.d("could not get byte stream",ex)
        }
        return null;
    }

  private byte[] readBytes(InputStream inputStream) throws IOException {
        // this dynamically extends to take the bytes you read
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

        // this is storage overwritten on each iteration with bytes
        int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];

        // we need to know how may bytes were read to write them to the byteBuffer
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            byteBuffer.write(buffer, 0, len);
        }

        // and then we can return your byte array.
        return byteBuffer.toByteArray();
    }

    private void handleAttachment(List<byte[]> imageDataList, String mimeType) {

        List<MultipartBody.Part> parts = new ArrayList<>();
        for (int i = 0; i < imageDataList.size(); i  ) {
            MultipartBody.Part body = null;
            switch (mimeType) {
                case MimeTypeConst.imageMimeTypeInRequest:
                    RequestBody requestFile = RequestBody.create(MediaType.parse(MimeTypeConst.imageMimeType),
                            imageDataList.get(i));
                    String fileName = "attachment"   i   ".jpg";
                    body = MultipartBody.Part.createFormData("image", fileName, requestFile);
                    break;
                case MimeTypeConst.pdfMimeType:
                     requestFile = RequestBody.create(MediaType.parse(MimeTypeConst.pdfMimeType),
                            imageDataList.get(i));
                    fileName = "attachment"   i   ".pdf";
                    body = MultipartBody.Part.createFormData("image", fileName, requestFile);
                    break;
            }
            parts.add(body);
        }
        uploadAttachment(parts);
    }