Удаленная загрузка файла через ASP.NET поврежденный файл - PullRequest
2 голосов
/ 31 марта 2011

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

У вас есть идеи, почему это так?или если мой подход неверен, не могли бы вы предложить мне лучший путь, пожалуйста?

     protected void Page_Load(object sender, EventArgs e)
    {

        string url = "http://server/scripts/isynch.dll?panel=AttachmentDownload&NoteSystem=SyncNotes&NoteType=Ticket&NoteId=1&Field=supp&File=DisplayList%2etxt";
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
        req.Credentials = new NetworkCredential("user", "pass");
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();


        ////Initialize the output stream
        Response.Clear();
        Response.ContentType = "application/octet-stream";
        Response.AppendHeader("Content-Disposition:", "attachment; filename=" + "DisplayList.txt");
        Response.AppendHeader("Content-Length", resp.ContentLength.ToString());

        ////Populate the output stream
        byte[] ByteBuffer = new byte[resp.ContentLength];
        Stream rs = req.GetResponse().GetResponseStream();

        rs.Read(ByteBuffer, 0, ByteBuffer.Length);
        Response.BinaryWrite(ByteBuffer);
        Response.Flush();

        ///Cleanup
        Response.End();
        rs.Dispose();
    }

Ответы [ 2 ]

2 голосов
/ 31 марта 2011
  • Прежде всего, используйте application/octet-stream, так как это стандартный тип контента для загрузки.
  • new byte[resp.ContentLength + 1] определит буфер, который на один байт больше, чем тип содержимого. Я считаю, что это причина коррупции. Используйте new byte[resp.ContentLength].

Я действительно рекомендую переписать его и удалить поток памяти:

        const int BufferLength = 4096;
        byte[] byteBuffer = new byte[BufferLength];
        Stream rs = req.GetResponse().GetResponseStream();

        int len = 0;
        while ( (len = rs.Read(byteBuffer,0,byteBuffer.Length))>0)
        {
            if (len < BufferLength)
            {
                Response.BinaryWrite(byteBuffer.Take(len).ToArray());
            }
            else
            {
                Response.BinaryWrite(byteBuffer);
            }
            Response.Flush();   


        }
1 голос
/ 31 марта 2011

статья на http://support.microsoft.com/default.aspx?scid=kb;en-us;812406 решила мою проблему.Большое спасибо @Aliostad за его усилия помочь мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...