У меня есть API, который возвращает файл PDF. Когда я размещаю URL-адрес в браузере, я получаю файл с определенным именем - не фиксированным - и он основан на запросе, отправленном в URL-адресе.
Однако, когда я загружаю этот файл из своего приложения, мне пришлось самому назвать файл. Я не хочу, чтобы мне было нужно то же имя, что и файл, который изначально был назван на сервере.
Как я могу этого добиться?
Запрос на модернизацию
private void initDownload(){
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://../.../API/")
.client(okHttpClient)
.build();
RetrofitInterface retrofitInterface = retrofit.create(RetrofitInterface.class);
Call<ResponseBody> request = retrofitInterface.downloadClientFile(8685);
try {
downloadFile(request.execute().body());
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
Здесь я получил тело, а затем создал файл с именем
private void downloadFile(ResponseBody body) throws IOException {
int count;
byte data[] = new byte[1024 * 4];
long fileSize = body.contentLength();
InputStream bis = new BufferedInputStream(body.byteStream(), 1024 * 8);
File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "file.pdf");
OutputStream output = new FileOutputStream(outputFile);
// Rest of the code ...
}
В реализации API имя файла возвращается в заголовке ответа, как показано ниже.
httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName