How can i download a file without file name and file extension in the url

前端 未结 3 656
北恋
北恋 2021-01-27 00:14

My problem is that I dont Know how i can download a File withknowing the file name or the file extension in the url, like this http://findicons.com/icon/download/235456/internet

相关标签:
3条回答
  • 2021-01-27 00:34

    You could inspect the Content-Disposition response header using an HTTP request to get the filename. This would be a more general solution, so even if the filename is not contained in the URL, it would work:

    var url = "http://findicons.com/icon/download/235456/internet_download/128/png?id=235724";
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        var fn = response.Headers["Content-Disposition"].Split(new string[] { "=" }, StringSplitOptions.None)[1];
        string basePath = @"X:\Folder\SubFolder"; // Change accordingly...
        var responseStream = response.GetResponseStream();
        using (var fileStream = File.Create(Path.Combine(basePath, fn)))
        {
            responseStream.CopyTo(fileStream);
        }
    }
    

    The above code uses certain methods and functions, you can find more information here:

    • HttpWebRequest - Usage example here
    • Saving a stream to a file - see this answer. Just note that when saving an HTTP response stream, you don't need to seek to the beginning, as it already is at the beginning and doing so will throw an exception. So, to be on the safe side, use it like I have in the code above.

    Hope this answer helps you :)

    0 讨论(0)
  • 2021-01-27 00:35

    It's possible to get the filename since the server is sending the Content-Disposition header. Here's a code example on how to get the filename using the HttpClient class:

    var url = "http://findicons.com/icon/download/235456/internet_download/128/png?id=235724";
    
    using (var client = new HttpClient())
    using (var response = await client.GetAsync(url))
    {
        // make sure our request was successful
        response.EnsureSuccessStatusCode();
    
        // read the filename from the Content-Disposition header
        var filename = response.Content.Headers.ContentDisposition.FileName;
    
        // read the downloaded file data
        var stream = await response.Content.ReadAsStreamAsync();
    
        // Where you want the file to be saved
        var destinationFile = Path.Combine("C:\\local\\directory", filename);
    
        // write the steam content into a file
        using (var fileStream = File.Create(destinationFile))
        {
            stream.CopyTo(fileStream);
        }
    }
    
    0 讨论(0)
  • 2021-01-27 00:52

    I've had a hard time solving this issue myself and have come to a solution solving some issues in relation of obtaining the file name automatically.

    Some headers does not include the Content Disposition as suggested in https://stackoverflow.com/a/37228939/8805908, but the ones that do is still used.

    I was wondering how Chrome, firefox etc. could obtain the name of the file though this information is not available through any header entry. I found that the links left without the information could be derived via its URL, from which i am using the code of:

    http://codesnippets.fesslersoft.de/how-to-get-the-filename-of-url-in-c-and-vb-net/

    My conclusion so far is; check the header for Content Disposition, if this does not contain any information check the URL for any file matches. So far I have not found a download link that I have not been able to retrieve the file name of.

    I hope this may solve some issues.

    --- Edit 12-06-2018

    The solution using these methods are satisfying the following links: 5 test cases

    0 讨论(0)
提交回复
热议问题