HttpURLConnection загруженное имя файла
Можно ли получить имя файла, загруженного с помощью HttpURLConnection?
URL url = new URL("http://somesite/getFile?id=12345");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setAllowUserInteraction(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
InputStream is = conn.getInputStream();
В приведенном выше примере я не могу извлечь имя файла из URL-адреса, но сервер каким-то образом отправит мне имя файла.
Ответы
Ответ 1
Вы можете использовать HttpURLConnection.getHeaderField(имя строки), чтобы получить заголовок Content-Disposition
, который обычно используется для установки имени файла
String raw = conn.getHeaderField("Content-Disposition");
// raw = "attachment; filename=abc.jpg"
if(raw != null && raw.indexOf("=") != -1) {
String fileName = raw.split("=")[1]; //getting value after '='
} else {
// fall back to random generated file name?
}
Как указывалось в другом ответе, сервер может вернуть недопустимое имя файла, но вы можете попробовать его.
Ответ 2
Ответ на откровенный вопрос: если веб-сервер не возвращает имя файла в заголовке Content-Disposition, нет реального имени файла. Возможно, вы можете установить его в последнюю часть URI после символа/и перед строкой запроса.
Map m =conn.getHeaderFields();
if(m.get("Content-Disposition")!= null) {
//do stuff
}
Ответ 3
Проверьте в заголовке Content-Disposition
: вложение.
Ответ 4
Map map = connection.getHeaderFields ();
if ( map.get ( "Content-Disposition" ) != null )
{
String raw = map.get ( "Content-Disposition" ).toString ();
// raw = "attachment; filename=abc.jpg"
if ( raw != null && raw.indexOf ( "=" ) != -1 )
{
fileName = raw.split ( "=" )[1]; // getting value after '='
fileName = fileName.replaceAll ( "\"", "" ).replaceAll ( "]", "" );
}
}