Как получить имя файла при нажатии на URL-адрес в веб-просмотре

Как получить имя файла, который мы загрузили на сервер, когда мы предоставляем ссылку на этот файл на странице?

Что я делаю, так это то, что я предоставляю данные со ссылкой на файл в веб-просмотре, поэтому всякий раз, когда пользователь нажимает на ссылку, необходимо загрузить его с сервера, поскольку я загружаю этот файл с сервера, но проблема не может получить его точный тип и имя с помощью DownloadManager. я хочу так

введите здесь описание изображения

См. выше. Я дал ссылку на свой файл в test_androt, и когда я нажму на нее, появится ежедневный журнал с опцией, имеющей имя файла, я не знаю, как получить это имя файла, когда пользователь щелкает URL-ссылку WebView.

Изменить Извините, что забыл упомянуть, что мой URL-адрес выглядит так

misc/dnload.php?t1=MzQ0MDA=&t2=MTY5NTUz&t3=MTY5NTUzMTMwMjEyMDNfcGhhcm1hY3kga2V5IGluZm8ucG5n&t4=MTMwMjEyMDM=

person Pratik    schedule 08.04.2013    source источник
comment
Вы делаете http-запрос для загрузки файла. Если это так, вы можете получить имя файла из содержимого заголовка.   -  person Raghunandan    schedule 16.04.2013


Ответы (4)


Я получил ответ благодаря Raghunandan за предложение.

Здесь мне нужен дополнительный вызов, чтобы получить информацию о заголовке загружаемого файла. В разделе заголовка я получил имя файла.

Также я нашел это сообщение Имя файла из URL, не содержащее суффикс имени файла, благодаря которому я получил более подробную информацию о деталях заголовка, которые мы можем получить. время запроса.

Поскольку мы можем использовать этот URLUtil.guessFileName(url, null, null), но это даст имя файла средства вызова для моего случая, у меня есть такой URL-адрес

misc/dnload.php?t1=MzQ0MDA=&t2=MTY5NTUz&t3=MTY5NTUzMTMwMjEyMDNfcGhhcm1hY3kga2V5IGluZm8ucG5n&t4=MTMwMjEyMDM=

поэтому из приведенной выше ссылки будет извлечено dnload.php в качестве имени файла, а не оригинальное имя файла, которое мы загружаем, это только что созданная ссылка для скачивания для этого файла.

вот код, использующий это, мы можем получить имя файла, это просто дополнительный вызов для получения информации, но на самом деле мы загружаем, для загрузки я использовал встроенный Android API для DownloadManager для загрузки файла.

Content-Disposition this is the attribute in header section through which we can get the file name as in attachment form.

Он вернет информацию таким образом Content-Disposition: attachment; filename="fname.ext", так что теперь просто нужно извлечь имя файла

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
    }
}
person Pratik    schedule 16.04.2013
comment
Рассмотрите возможность setRequestMethod("HEAD") вместо GET, так как вам нужны только заголовки. Кроме того, в более общем случае помните, что depo может быть нулевым, depo может присутствовать, но не иметь имени файла, или имя файла может быть закодировано URL-адресом сервером из-за нестандартное поведение вездесущего Internet Explorer. - person quietmint; 19.04.2013
comment
@Pratik: я пробовал описанный выше подход, но в моем случае он не сработал. Можете ли вы помочь мне с моим запросом здесь: stackoverflow.com/questions/24577166/ - person r.bhardwaj; 05.07.2014

Вы можете просто проанализировать URL-адрес и получить текст после последнего «/» и сделать это именем файла, или вы можете использовать следующее

URLUtil.guessFileName(url, contentDisposition, mimetype);

показано ниже, как я использовал его в своем 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
}

Если вы не хотите использовать его внутри своего DownloadListener, вы можете использовать его без contentDisposition или mimetype, просто передав «null» для каждого параметра, кроме URL-адреса (также передайте URL-адрес).

РЕДАКТИРОВАТЬ: это работает, только если у вас есть URL-адрес с встроенным в него именем файла. См. ответ Pratik выше, если вы ищете более надежный способ.

person anthonycr    schedule 08.04.2013

Некоторые уточнения решения Pratik.

Изменения:

1) исправлено извлечение некорректного имени файла из Content-Disposition

2) добавлен интерфейс обратного вызова

Применение:

new GetFileInfo(new GetFileInfoListener() {
    @Override
    public void onTaskCompleted(String fileName) {
        Log.v(TAG, "real filename is " + fileName);
    }
}).execute(url);

Код:

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);
    }
}
person yuliskov    schedule 30.04.2017

Это позволит получить имя файла с сервера, требующего аутентификации (через файлы cookie). Для этого вам нужно получить имя файла из заголовка содержимого сервера, мы делаем это асинхронно (вы не можете сделать вызов http в основном потоке), а затем передать класс для загрузки файла после использования имени файла.

FileNameUtil.java

public class FileNameUtil extends AsyncTask<String, Void, String> {

    private OnGetFileNameCompleted mListener;

    public FileNameUtil(OnGetFileNameCompleted listener) {
        super();
        mListener = listener;
    }

    @Override
    public String doInBackground(String... params) {

        String filename = null;

        try {
            URL url = new URL(params[0]);

            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestProperty("Cookie", "PHPSESSID=" + WebService.sessionId);
            con.setRequestMethod("HEAD");
            con.setInstanceFollowRedirects(false);
            con.connect();

            String content = con.getHeaderField("Content-Disposition");

            String contentSplit[] = content.split("filename=");

            filename = contentSplit[1].replace("filename=", "").replace("\"", "").trim();

        } catch (Exception e) {
        }

        return filename;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String filename) {
        super.onPostExecute(filename);
        mListener.processFinish(filename);
    }
}

OnGetFileNameCompleted.java

public interface OnGetFileNameCompleted {

    void processFinish(String filename);
}

Активность.java

 final Context c = this;

 row.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String url = "http://192.168.1.100/document.php?id=583";

                FileNameUtil fileNameUtil = new FileNameUtil(new OnGetFileNameCompleted() {

                        @Override
                        public void processFinish(String filename) {
                            try {
                                DownloadManager dm = (DownloadManager) context.getSystemService(DOWNLOAD_SERVICE);
                                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
                                request.addRequestHeader("Cookie", "PHPSESSID=" + WebService.sessionId);
                                dm.enqueue(request);

                                if (filename != null) {
                                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);
                                }

                                Intent i = new Intent();
                                i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
                                context.startActivity(i);
                            } catch (Exception e) {
                                showMessage(R.string.error, R.string.error_occurred);
                            }
                        }
                    });

                    fileNameUtil.execute(url);
            }
        });
person Ricardo Saracino    schedule 04.06.2018
comment
добавил объяснение - person Ricardo Saracino; 04.06.2018