2009-12-06 5 views
5

J'ai une application Silverlight qui doit télécharger de gros fichiers sur le serveur. J'ai regardé le téléchargement en utilisant à la fois WebClient et HttpWebRequest, mais je ne vois pas de façon évidente le flux de téléchargement avec l'une ou l'autre option. Faire à la taille des fichiers, en chargeant le contenu entier dans la mémoire avant uplaoding n'est pas raisonnable. Est-ce possible dans Silverlight?Silverlight streaming upload

+0

+1 Une très bonne question, j'aurais aimé avoir une bonne réponse. De quelle taille parle-t-on? – AnthonyWJones

+0

Il ya des fichiers WAV qui peuvent atteindre environ 150 Mo + – herbrandson

Répondre

1

Vous pourriez adopter une approche de «découpage». Le fichier Silverlight Uploader sur CodePlex utilise cette technique:

http://www.codeplex.com/SilverlightFileUpld

Compte tenu d'une taille de bloc (par exemple 10k, 20k, 100k, etc), vous pouvez diviser le fichier et envoyer chaque morceau au serveur en utilisant un HTTP demande. Le serveur devra gérer chaque segment et réassembler le fichier à l'arrivée de chaque fragment. Dans un scénario de batterie de serveurs Web lorsqu'il existe plusieurs serveurs Web, veillez à ne pas utiliser le système de fichiers local sur le serveur Web pour cette approche.

+0

Une idée sur la façon de persister les morceaux 'sur le côté serveur (disons en WCF) et ré-assembler? – atconway

+1

J'ai utilisé deux techniques: 1) enregistrer chaque morceau comme un fichier sur le système de fichiers quand il arrive, puis réassembler les fichiers dans le bon ordre après que tous les morceaux ont été écrits et 2) enregistrer chaque morceau en tant que données binaires une base de données, puis ré-assembler. Vous devrez utiliser la technique n ° 2 ou un système de fichiers distribué si votre site est en charge d'équilibrage sur plusieurs serveurs Web. – kindohm

+0

Étant donné que l'emplacement de mon système de fichiers réside sur le même serveur que le serveur WCF et qu'il ne s'agit pas d'un serveur à charge équilibrée, je pense que le # 1 fonctionnera très bien. Avez-vous des exemples d'écriture et de réassemblage? Quel genre de lecteur/écrivain utiliseriez-vous? Merci pour l'aide. – atconway

1

Il semble incroyable que WebClient dans Silverlight ne fournisse pas un moyen de pomper un flux vers le serveur avec des événements de progression. C'est particulièrement étonnant puisque ceci est offert pour un téléchargement de chaîne!

Il est possible de coder ce qui semblerait faire ce que vous voulez avec un HttpWebRequest.

Dans le rappel BeginGetRequestStream, vous pouvez obtenir le flux pour la demande sortante, puis lire les morceaux du flux de votre fichier et les écrire dans le flux de sortie. Malheureusement, Silverlight ne commence pas à envoyer la sortie au serveur tant que le flux de sortie n'a pas été fermé. Là où toutes ces données finissent par être stockées entre-temps je ne sais pas, il est possible que si elles deviennent assez grandes, SL puisse utiliser un fichier temporaire pour ne pas stresser la mémoire des machines mais ensuite il peut tout stocker en mémoire en tous cas.

La seule solution à ce qui pourrait être possible est d'écrire le protocole HTTP via des sockets.

+0

Je parle un peu des sockets et le problème est que les sockets Silverlight ne peuvent pas se connecter au port 80 (seulement 4502 à 4534) – herbrandson