Почему мой код для загрузки файлов создает поврежденные PDF-файлы?

У меня проблема при загрузке файлов PDF со следующим кодом:

WebClient client = new WebClient();
client.DownloadFile(remoteFilename, localFilename);

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


person Syed Mudhasir    schedule 10.01.2011    source источник
comment
В чем проблема?   -  person Andrew Bezzub    schedule 10.01.2011
comment
Моя проблема заключается в загрузке файла PDF и сохранении его в виде документа PDF с помощью вышеуказанного кода. когда я пытаюсь открыть, он показывает ошибку восстановления документа.   -  person Syed Mudhasir    schedule 10.01.2011
comment
Я надеюсь, что эта ссылка ниже поможет вам... " title="можно ли использовать сброс ответа вместо конца ответа"> stackoverflow.com/questions/10829168/   -  person Viishnuu    schedule 11.06.2013
comment
Я не думаю, что на этот вопрос можно ответить, потому что предоставлено так мало информации. Благодаря использованию WebClient и термина загрузка (загрузка) становится ясно, что речь идет о коде на стороне клиента, так почему же так много ответов показывают код на стороне сервера (и получение тоже за него проголосовал)? Где недоразумение?   -  person Lance U. Matthews    schedule 04.02.2020


Ответы (7)


проверьте этот метод, надеюсь, что это поможет

        public static void DownloadFile(HttpResponse response,string fileRelativePath)
    {
        try
        {
            string contentType = "";
            //Get the physical path to the file.
            string FilePath = HttpContext.Current.Server.MapPath(fileRelativePath);

            string fileExt = Path.GetExtension(fileRelativePath).Split('.')[1].ToLower();

            if (fileExt == "pdf")
            {
                //Set the appropriate ContentType.
                contentType = "Application/pdf";
            }

            //Set the appropriate ContentType.
            response.ContentType = contentType;
            response.AppendHeader("content-disposition", "attachment; filename=" + (new FileInfo(fileRelativePath)).Name);

            //Write the file directly to the HTTP content output stream.
            response.WriteFile(FilePath);
            response.End();
        }
        catch
        {
           //To Do
        }
    }
person Mahmoud Farahat    schedule 10.01.2011
comment
вы должны установить contentType = Application/pdf; чтобы убедиться, что загруженный файл является правильным файлом PDF - person Mahmoud Farahat; 10.01.2011
comment
Спасибо, Махмуд. Я попробовал это, но получаю следующую ошибку: Не удалось найти имя типа или пространства имен «HttpResponse» (вам не хватает директивы использования или ссылки на сборку?) - person Syed Mudhasir; 10.01.2011
comment
@Сайед Мудхасир. Вы должны добавить ссылку «System.Web» в свой проект «Ссылки». - person BantenCity; 10.01.2011
comment
Я добавил эту строку с помощью Systems.Web; но я получаю ту же ошибку - person Syed Mudhasir; 10.01.2011
comment
@Mahmoud: веб-приложение - person Syed Mudhasir; 10.01.2011
comment
@syed: хорошо, попробуйте полное имя System.Web.HttpResponse - person Mahmoud Farahat; 10.01.2011
comment
@syed: не забудьте добавить ссылки на system.web (щелкните правой кнопкой мыши по ссылкам > добавьте ссылку) - person Mahmoud Farahat; 10.01.2011
comment
Большое спасибо, ошибки DOS устранены. Но думаю, что я неправильно вызываю функцию: DownloadFile(neevia.com / PDF / cluster.pdf, d: /clustering_check.pdf); пожалуйста, дайте мне пример 2 параметров, которые я должен передать в cal dis func - person Syed Mudhasir; 10.01.2011
comment
Я получаю следующую ошибку: Аргумент «1»: невозможно преобразовать из «строки» в «System.Web.HttpResponse». - person Syed Mudhasir; 10.01.2011
comment
@syed: хорошо, теперь вы находитесь в файле .aspx веб-страницы в коде вызова этого метода, например: DownloadFile (Response, File_Path) - person Mahmoud Farahat; 10.01.2011
comment
@Mahmoud: как и как мне указать URL-адрес: neevia.com / PDF / cluster.pdf - person Syed Mudhasir; 11.01.2011
comment
@syed : хммм .. , я думаю, есть недоразумение. , этот код нужно разместить на вашем сайте, где посетители смогут щелкнуть ссылку и скачать файл. Вы хотите это сделать или хотите скачать файл с другого сайта??!!! - person Mahmoud Farahat; 11.01.2011
comment
Это код на стороне сервера, тогда как вопрос касается использования WebClient на стороне клиента. - person Lance U. Matthews; 04.02.2020

Пожалуйста, попробуйте следующий пример кода, чтобы загрузить файл .pdf.

 Response.ContentType = "Application/pdf"; 
 Response.AppendHeader("Content-Disposition", "attachment; filename=Test_PDF.pdf"); 
 Response.TransmitFile(Server.MapPath("~/Files/Test_PDF.pdf")); 
 Response.End();
person Raaghav    schedule 18.05.2012
comment
Это код на стороне сервера, тогда как вопрос касается использования WebClient на стороне клиента. По сути, это то же самое, что и ответ @MahmoudFarahat более чем годом ранее. - person Lance U. Matthews; 04.02.2020

@Syed Mudhasir: Это просто строка :)

client.DownloadFileAsync(new Uri(remoteFilename, UriKind.Absolute), localFilename);

Он будет загружать pdf-файлы. :)

person JAVA    schedule 06.04.2012

Ни одно из этих решений не сработало для меня или не было полным. Может быть, этот пост был старым, и новые версии .NET упростили его? Во всяком случае, следующий небольшой код отлично справился со своей задачей:

  static async Task DownloadFile(string url, string filePath)
  {
     using (var wc = new WebClient())
        await wc.DownloadFileTaskAsync(url, filePath);
  }

А вот как можно вызвать метод:

Task.Run(async () => { await DownloadFile(url, filePath); }).Wait();
person Behzad Talebpour    schedule 15.12.2018

    public void DownloadPdf(String downloadLink, String storageLink)
    {
        using (WebClient wc = new WebClient())
        {
            wc.DownloadFile(downloadLink, storageLink);
        }
        Console.Write("Done!");
    }

    static void Main(string[] args)
    {
        Program test = new Program();
        test.DownloadPdf("*PDF file url here*", @"*save location here/filename.pdf*");
        Console.ReadLine();
    }

Убедитесь, что вы добавили: using System.Net;

person Raghu Raj Rai    schedule 28.02.2019
comment
По сути, это тот же код, что и в вопросе, только завернутый в метод. Почему ожидается, что этот код создаст читаемый файл, а код в вопросе - нет? - person Lance U. Matthews; 04.02.2020

Это сработало для меня:

string strURL = @"http://192.168.1.xxx/" + sDocumento;
WebClient req = new WebClient();
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.ClearContent();
response.ClearHeaders();
response.Buffer = true;
response.AddHeader("Content-Disposition", "attachment;filename=\"" + sDocumento + "\"");
byte[] data = req.DownloadData(strURL);
response.BinaryWrite(data);
response.End();
person Eric Correa    schedule 23.02.2018
comment
Если вы удалите ссылки на пространство имен System.Web, которое не было указано в вопросе и подразумевает, что это код на стороне сервера, это станет просто WebClient req = new WebClient(); byte[] data = req.DownloadData(strURL);, что не так уж отличается от того, что указано в вопросе. Итак, как это решает проблему? - person Lance U. Matthews; 04.02.2020

person    schedule
comment
Что это вообще делает и как это относится к вопросу? Кажется, он выясняет тип MIME, так что это должно запускаться на стороне сервера? Как узнать, что сервер работает под управлением Windows и находится под контролем загружающей стороны? Где WebClient и передача файлов? - person Lance U. Matthews; 04.02.2020