2010-03-31 6 views
1

J'ai une applet Java pour télécharger des fichiers sur le serveur. Je veux afficher le% de données envoyées mais quand j'utilise ObjectOutputStream.write() il écrit juste dans le tampon, n'attend pas jusqu'à ce que les données aient été réellement envoyées. Comment puis-je atteindre cet objectif. Peut-être que j'ai besoin d'utiliser la synchronisation de thread ou quelque chose. Tous les indices seraient très utiles.Afficher% de téléchargement terminé

+1

Recherchez le code existant qui fait cela. N'écrivez pas vous-même – Pyrolistical

Répondre

1

Ce que je cherchais était en fait:

setFixedLengthStreamingMode(int contentLength) 

Cela empêche toute mise en mémoire tampon interne me permettant connaître exactement la quantité de données envoyées.

4

N'utilisez pas ObjectOutputStream. C'est pour écrire des objets Java sérialisés, pas pour écrire des données binaires brutes. Cela peut en effet bloquer le flux. Plutôt juste écrire directement à la OutputStream de la connexion URL.

Cela dit, le code semble assez compliqué. Même après avoir relu plusieurs fois et cligné des yeux d'innombrables fois, je ne peux pas le faire correctement. Je vous suggère d'envoyer ces fichiers selon le codage multipart/form-data avec l'aide de Commons HttpClient. Vous pouvez trouver here un exemple de code de base. Il vous suffit de modifier Part[] parts pour inclure tous les fichiers. La servlet de l'autre côté peut à son tour utiliser Commons FileUpload pour analyser la requête multipart/form-data.

Pour calculer le progrès, je suggérerais de choisir CountingOutputStream de Commons IO. Enveloppez simplement le OutputStream avec et écrivez-y.

Mise à jour: si vous ne souhaitez pas envoyer votre applet avec les bibliothèques plus 3ème partie (ce qui je crois est raisonnable), alors jetez un oeil à this code snippet (et la question initiale mentionnée comme 1er lien) comment créer un multipart/form-data corps vous-même en utilisant URLConnection.

+0

Merci beaucoup. Je sais que le code est compliqué. Je ne l'ai pas écrit moi-même depuis que je viens d'avoir ce code et que j'essaie de faire de nouveaux trucs dedans. Je vais essayer à vos exemples. Au fait, je voulais juste vous féliciter pour votre blog car cela m'a beaucoup aidé avec JSF! – user295744

+0

J'ai besoin d'utiliser ObjectOutputStream parce que j'envoie un HashMap avant le code que j'ai présenté ici ... – user295744

+0

Merci. Eh bien, c'est la nature de 'ObjectOutputStream'. Il ne peut pas envoyer l'octet de données par octet, il peut seulement envoyer les données dans des morceaux/objets. Utilisez-le ou laissez-le tomber et envoyez-lui une requête HTTP multipart/form-data "normale". – BalusC

Questions connexes