Загрузка Silverlight 4 RC с прогрессом загрузки: как? - PullRequest
3 голосов
/ 27 марта 2010

Было заявлено, что одна из новых функций Silverlight 4 RC заключается в том, что теперь он поддерживает процесс загрузки.

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

Спасибо!

Ответы [ 2 ]

4 голосов
/ 09 апреля 2010

Хорошо, после многих игр я понял это:

   private void UploadFile(string url, CustomPostDataInfo pdi)
    {

        // Use the client http stack!

        //HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
        HttpWebRequest webRequest = (HttpWebRequest)WebRequestCreator.ClientHttp.Create(new Uri(url));

        webRequest.AllowWriteStreamBuffering = false; // <-- this enables upload progress reporting!

        webRequest.Method = "POST";
        webRequest.ContentType = "multipart/form-data; boundary=" + pdi.Boundary; // Boundary only needed for multipart form ada

        // Calculate our response length
        webRequest.ContentLength = pdi.FormDataHeader.Length + pdi.File2Upload.Length + pdi.FormDataFooter.Length; // Calculate the length of your entire message here, required

        pdi.request = webRequest;

        webRequest.BeginGetRequestStream(new AsyncCallback(WriteToStreamCallback), pdi);
    }

    private void WriteToStreamCallback(IAsyncResult asynchronousResult)
    {
        CustomPostDataInfo pdi = (AmazonS3PostDataInfo)asynchronousResult.AsyncState;
        HttpWebRequest webRequest = pdi.request;
        Stream requestStream = webRequest.EndGetRequestStream(asynchronousResult);
        UTF8Encoding encoding = new UTF8Encoding();

        UpdateShowProgress(false, "Uploading file..."); // Your custom update event - make sure to use a Dispatcher to update on the UI thread as this is running on a separate thread.

        // Write any pre file data if needed
        // ...

        // Write our file data
        {
            // Read chunks of this file
            byte[] buffer = new Byte[1024 * 32];
            Stream fileStream = pdi.File2Upload.OpenRead();
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                requestStream.Write(buffer, 0, bytesRead);
                requestStream.Flush(); // Will block until data is sent

                bytesUploaded += bytesRead;

                //Show the progress change
                UpdateShowProgress(false, "Uploading file...");
            }
        }

        // Write any post file data
        // ...

        UpdateShowProgress(false, "Uploaded, waiting for response...");

        requestStream.Close();

        // Get the response from the HttpHandler
        webRequest.BeginGetResponse(new AsyncCallback(ReadHttpResponseCallback), webRequest);

    }

    private void ReadHttpResponseCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
        HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
        StreamReader reader = new StreamReader(webResponse.GetResponseStream());

        string response = reader.ReadToEnd(); // Get the result

        reader.Close();

        UpdateShowProgress(true, response);
    }
0 голосов
/ 07 апреля 2010

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

Может быть, это поможет вам, я не могу точно сказать, имеет ли он "чанкинг" или работает так, как вы ожидаете. Удачи!

С наилучшими пожеланиями
Томас

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