Cómo obtener el nombre de archivo al hacer clic en URL en la vista web
¿Cómo obtener el nombre del archivo que subimos en el servidor cuando proporcionamos vinculado para ese archivo en la página?
Lo que estoy haciendo es, estoy proporcionando datos con vínculo de archivo en webview así que cada vez que haga clic en el enlace del usuario necesita descargar desde el servidor como he descargar este archivo desde el servidor, pero el problema no es capaz de obtener su tipo exacto y el nombre utilizando DownloadManager. Quiero como este
- Android: reducción de la calidad de los píxeles en las imágenes cargadas en WebView
- El teclado flexible de Android oculta las entradas de CordovaWebView cuando está en pantalla completa
- Android WebView HTML5 Video Spawns MediaPlayer que vive para siempre en Samsung S4
- Detectar error de vista Web y mostrar mensaje
- Android webview - solo línea javascript comentarios causando Uncaught SyntaxError errores?
Ver en arriba he dado el enlace para mi archivo en test_androt y cuando hago clic en le dará el dailog con la opción de tener el nombre del archivo, no sé cómo lograr este nombre de archivo cuando el usuario haga clic en el enlace URL WebView.
Editar Desafortunadamente olvidé mencionar que mi URL se ve así
misc/dnload.php?t1=MzQ0MDA=&t2=MTY5NTUz&t3=MTY5NTUzMTMwMjEyMDNfcGhhcm1hY3kga2V5IGluZm8ucG5n&t4=MTMwMjEyMDM=
- WebView OverScroll
- Respuesta HTTP POST en WebView en android
- Enviar datos a la página cargada en WebView
- No se puede abrir el archivo descargado a través del administrador de descargas api
- Cómo configurar el tamaño de texto en WebView en android
- Definir peculiaridad para WebView
- ¿Cómo implementar pull down refresh en android?
- OnPageFinished () nunca llamado (webview)!
Usted podría simplemente analizar la url y obtener el texto después de la última "/" y hacer que el nombre del archivo, o puede utilizar el siguiente
URLUtil.guessFileName(url, contentDisposition, mimetype);
Mostrado abajo como lo he usado en mi DownloadListener:
//this stuff goes inside your DownloadListener @Override public void onDownloadStart(final String url, String userAgent,final String contentDisposition, final String mimetype, long contentLength) { String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype); //returns a string of the name of the file THE IMPORTANT PART //proceed with download }
Si no desea usarlo dentro de su DownloadListener, puede usarlo sin el contentDisposition o mimetype simplemente pasando 'null' en cada parámetro, excepto la url (pasar la url) también.
EDIT: Esto sólo funciona si tiene una url con un nombre de archivo incrustado en él. Vea la respuesta de Pratik arriba si usted está buscando una manera más infalible.
Tengo la respuesta gracias a Raghunandan por sugerencia.
Aquí necesito una llamada extra para obtener la información de cabecera del archivo de descarga. En la sección de encabezado obtuve el nombre del archivo.
También encontré este nombre de archivo de la URL que no contiene el sufijo de nombre de archivo a través del cual obtuve más detalles sobre el detalle de cabecera que podemos obtener al solicitar tiempo.
Como podemos usar este URLUtil.guessFileName(url, null, null)
pero esto dará el nombre de archivo de los medios de llamada para mi caso tengo url como este
misc/dnload.php?t1=MzQ0MDA=&t2=MTY5NTUz&t3=MTY5NTUzMTMwMjEyMDNfcGhhcm1hY3kga2V5IGluZm8ucG5n&t4=MTMwMjEyMDM=
Por lo que desde el enlace anterior esto extraerá el dnload.php como nombre de archivo no es el nombre del archivo original que descargarlo acaba de crear vínculo de descarga para ese archivo.
Aquí está el código usando esto podemos obtener el nombre del archivo sólo una llamada extra para obtener la información, pero en realidad se descarga, para descargar he utilizado android inbuilt api a DownloadManager para descargar el archivo.
Content-Disposition this is the attribute in header section through which we can get the file name as in attachment form.
Va a devolver la información de esta manera Content-Disposition: attachment; filename="fname.ext"
Content-Disposition: attachment; filename="fname.ext"
por lo que ahora sólo tiene que extraer el nombre de archivo
class GetFileInfo extends AsyncTask<String, Integer, String> { protected String doInBackground(String... urls) { URL url; String filename = null; try { url = new URL(urls[0]); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.connect(); conn.setInstanceFollowRedirects(false); String depo = conn.getHeaderField("Content-Disposition"); String depoSplit[] = depo.split("filename="); filename = depoSplit[1].replace("filename=", "").replace("\"", "").trim(); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (IOException e) { } return filename; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onPostExecute(String result) { super.onPostExecute(); // use result as file name } }
Algunos refinamientos para la solución de Pratik.
Cambios:
1) extracción fija del nombre de archivo roto de Content-Disposition
2) interfaz de devolución de llamada añadida
Uso:
new GetFileInfo(new GetFileInfoListener() { @Override public void onTaskCompleted(String fileName) { Log.v(TAG, "real filename is " + fileName); } }).execute(url);
Código:
class GetFileInfo extends AsyncTask<String, Integer, String> { public interface GetFileInfoListener { void onTaskCompleted(String result); } private final GetFileInfoListener mListener; public GetFileInfo(GetFileInfoListener listener) { mListener = listener; } protected String doInBackground(String... urls) { URL url; String filename = null; try { url = new URL(urls[0]); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.connect(); conn.setInstanceFollowRedirects(false); String depo = conn.getHeaderField("Content-Disposition"); if (depo != null) filename = depo.replaceFirst("(?i)^.*filename=\"?([^\"]+)\"?.*$", "$1"); else filename = URLUtil.guessFileName(urls[0], null, null); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (IOException e) { } return filename; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); if (mListener != null) mListener.onTaskCompleted(result); } }
- Android GridView agregar encabezado y pie de página como listview
- ClassCastException ViewGroup $ LayoutParams no se puede convertir en ViewPager $ LayoutParams