2017-08-21 5 views
1

Je cherche à ajouter une barre de progression à un téléchargement de fichier sur un WebService.Application C# Winforms - Barre de progression de téléchargement de flux

Je viens de commencer à travailler sur une application WinForms que je crois utilise WCF pour permettre au client de télécharger un document à notre référentiel d'entreprise. J'utilise un UploadService où je le passe un flux en plusieurs parties composé de métadonnées et d'un fichier. J'ai déjà pris soin de construire cette partie.

Je ne suis pas sûr de savoir comment aller sur la façon d'accrocher « quelque chose » au flux afin que je puisse le suivre en cours de téléchargement

J'ai vu des personnes qui utilisent un travailleur de fond pour suivre la progression d'un tâche asynchrone, mais ne peut pas trouver un exemple de quelqu'un qui fait cela pour suivre un fichier téléchargé sur un WebService. J'ai seulement l'air de trouver un exemple de quelqu'un qui suit le flux en cours de construction en mémoire.

Tout conseil/aide est apprécié.

Merci!

  • (je suis un stagiaire, donc si je les choses mal-expliqué, je présente mes excuses, je serais heureux de fournir des détails plus clairs si nécessaire.)

modifier: D'après ce que je peux dire la méthode pour télécharger le flux ne prend qu'un flux, il n'y a pas d'option pour lui donner la taille du flux, ou combien d'octets à lire à la fois.

Répondre

0

En supposant que vous connaissiez la taille du fichier (s'il est local, vous le feriez probablement).

Vous y accédez probablement en tant que flux, et vous le copiez ensuite dans le flux de téléchargement.

Si vous faites en morceaux (par exemple un tampon), alors vous pouvez calculer les progrès:

var totalNumberOfChunks = (fileSize/chunkSize); 
for(var chunk = 0; chunk < totalNumberOfChunks; chunk++) 
{ 
    // assuming you have the chunk byte array 
    // and have already sent it up to the server 

    var progress = ((double)chunk/totalNumberOfChunks) * 100; 
    // do something to surface this progress 
} 

Essentiellement vous voulez juste travailler combien de morceaux séparés de données que vous envoyez, et alors que vous les envoyez, calculez à quelle distance vous vous trouvez et faites surface le progrès en quelque sorte.

Bien sûr, il y a parfois des façons de le faire faire pour vous: Getting the upload progress during file upload using Webclient.Uploadfile

+0

Merci pour la réponse! Honnêtement, je n'arrive pas à comprendre comment ils définissent le chunkSize. Je ne vois nulle part dans la base de code où ils se réfèrent même à Webclient.Uploadfile Il me semble qu'ils ont écrit leur propre méthode de téléchargement à l'intérieur d'une classe UploadService qui se trouve dans le WebService. Cette méthode prend simplement dans un flux. Est-il possible qu'ils définissent la taille de bloc max dans un app.config? – cicero866

+0

Sans voir le code qui effectue le téléchargement, il est très difficile de réellement répondre comment appliquer cela à votre problème spécifique. – Clint

+0

J'ai créé ma propre classe Stream personnalisée et j'ai fait un override de la méthode Read pour déclencher un évènement à chaque fois que read a été appelé. Il me donne ensuite la position actuelle dans le courant ainsi que la longueur actuelle. Je reçois maintenant cependant l'erreur suivante: "Inverse du flux multi-parties MIME. Le message multi-parties MIME n'est pas ocmplete." – cicero866