#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);
}