Как получить нормальное имя файла при скачивании?

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
113

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
Методами зенно - никак.
Если шарпом, то парсить имя файла из заголовков респонса.


HTTP/1.1 200 OK
Server: nginx
Date: Sun, 19 Feb 2017 08:40:50 GMT
Content-Type: image/jpeg
Content-Length: 144034
Connection: keep-alive
Cache-Control: max-age=2678400, public
Expires: Wed, 22 Mar 2017 08:40:50 GMT
ETag: cd0960a0c155b0e40f0b8dd2f00739560a9b48cd
Last-Modified: Sat, 18 Feb 2017 06:17:08 GMT
Content-disposition: inline; filename=cd0948cd.jpg
Strict-Transport-Security: max-age=31536000; includeSubDomains
 
  • Спасибо
Реакции: Dimionix и doc
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
113
Одним гет запросом никак? МБ в md5 перекинуть ссылку?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 605
Благодарностей
4 595
Баллы
113
Выше вроде как минимальный подход описан. Скачать заголовки, выпарсить имя
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 190
Баллы
113
Все проще простого:

Код:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://q2.s4.jc9.ru/filecpd.php?u=aHR0cHM6Ly9kYXRhLmpjOS5ydS9pbWFnZXMvX2pjdHJhZGUvMjAxNzAyLzE4LzAwMDk3OS9qY3RyYWRlMTQ4NzM5NzIzMy04NzYxNy02MjgxOTEuanBn&tp=custom&w=1280&h=960&s=1&l&nocrop&sc=88c93&ver=2");
req.Timeout = 10000;
req.AllowAutoRedirect = false;
req.ContentType = "GET";
req.ServicePoint.Expect100Continue = false;
req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36 OPR/43.0.2442.806";
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
req.Headers.Add("Accept-Encoding", "gzip, deflate, sdch, br");
req.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");


using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
using (Stream respStream = resp.GetResponseStream())
{
    string name = resp.GetResponseHeader("Content-disposition").Split('=')[1];
    byte[] buffer = new byte[2048];
    int bytesRead = 0;
           
    using (FileStream fs = new FileStream(@"C:\" + name, FileMode.Create, FileAccess.Write))
    {
        while ((bytesRead = respStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            fs.Write(buffer, 0, bytesRead);
        }
    }
}
Со стримами часть можно сделать короче, вот так:

Код:
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
using (Stream respStream = resp.GetResponseStream())
using (FileStream fs = new FileStream(@"C:\" + resp.GetResponseHeader("Content-disposition").Split('=')[1], FileMode.Create, FileAccess.Write))
      respStream.CopyTo(fs);
 
Последнее редактирование:
  • Спасибо
Реакции: Radzhab

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
  • Спасибо
Реакции: Radzhab

Evgeny76

Client
Регистрация
11.09.2015
Сообщения
192
Благодарностей
85
Баллы
28
Все проще простого:

Код:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://q2.s4.jc9.ru/filecpd.php?u=aHR0cHM6Ly9kYXRhLmpjOS5ydS9pbWFnZXMvX2pjdHJhZGUvMjAxNzAyLzE4LzAwMDk3OS9qY3RyYWRlMTQ4NzM5NzIzMy04NzYxNy02MjgxOTEuanBn&tp=custom&w=1280&h=960&s=1&l&nocrop&sc=88c93&ver=2");
req.Timeout = 10000;
req.AllowAutoRedirect = false;
req.ContentType = "GET";
req.ServicePoint.Expect100Continue = false;
req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36 OPR/43.0.2442.806";
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
req.Headers.Add("Accept-Encoding", "gzip, deflate, sdch, br");
req.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");


using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
using (Stream respStream = resp.GetResponseStream())
{
    string name = resp.GetResponseHeader("Content-disposition").Split('=')[1];
    byte[] buffer = new byte[2048];
    int bytesRead = 0;
          
    using (FileStream fs = new FileStream(@"C:\" + name, FileMode.Create, FileAccess.Write))
    {
        while ((bytesRead = respStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            fs.Write(buffer, 0, bytesRead);
        }
    }
}
Со стримами часть можно сделать короче, вот так:

Код:
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
using (Stream respStream = resp.GetResponseStream())
using (FileStream fs = new FileStream(@"C:\" + resp.GetResponseHeader("Content-disposition").Split('=')[1], FileMode.Create, FileAccess.Write))
      respStream.CopyTo(fs);
А что надо подправить в коде если Content-disposition встречаются вот такого вида:
C#:
attachment; filename*=UTF-8''%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82.PDF
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)