Мне нужно загрузить файл с сервера, поэтому я использую модификацию и этот метод для сохранения файла на диск.
Вот мой код
@GET
Call<ResponseBody> downloadFileWithDynamicUrlSync(@Url String fileUrl);
Метод для загрузки файла
private void dowloadFile(String url, FileListItem item) {
Call<ResponseBody> callb = RestClient.getInstance().getService().downloadFileWithDynamicUrlSync(url);
callb.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()) {
Log.d(TAG, "server contacted and has file");
boolean writtenToDisk = writeResponseBodyToDisk(response.body(), item);
if(writtenToDisk){
MdocUtil.showToastShort(context, context.getString(R.string.file_dowloaded_succ));
}else{
MdocUtil.showToastShort(context, context.getString(R.string.error_download));
}
Log.d(TAG, "file download was a success? " + writtenToDisk);
} else {
Log.d(TAG, "server contact failed");
APIError error = ErrorUtils.parseError(response);
MdocUtil.showToastShort(context, error.getMessage());
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e(TAG, "error");
}
});
}
Метод записи файла на диск
private boolean writeResponseBodyToDisk(ResponseBody body, FileListItem item) {
try {
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + File.separator + item.getName());
InputStream inputStream = null;
OutputStream outputStream = null;
try {
byte[] fileReader = new byte[4096];
long fileSize = body.contentLength();
long fileSizeDownloaded = 0;
inputStream = body.byteStream();
outputStream = new FileOutputStream(file);
while (true) {
int read = inputStream.read(fileReader);
if (read == -1) {
break;
}
outputStream.write(fileReader, 0, read);
fileSizeDownloaded += read;
Log.d(TAG, "file download: " + fileSizeDownloaded + " of " + fileSize);
}
outputStream.flush();
return true;
} catch (IOException e) {
return false;
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
} catch (IOException e) {
return false;
}
Этот код отлично работает при загрузке изображения, но не работает для файлов .pdf и .docx, в этом случае записанный ToDisk имеет значение trueно на телефоне нет файла.
ОБНОВЛЕНИЕ: Проблема в том, что я не установил токен доступа в заголовке, который запрашивается сервером для файлов, но не для изображений.