IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Communication Foundation .NET Discussion :

Uploader des morceaux de fichier


Sujet :

Windows Communication Foundation .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut Uploader des morceaux de fichier
    Bonjour.

    Voici mon premier Service Web en c#. A cette occasion, j'aimerais bénéficier d'un petit coup de main svp.
    Je dois uploader un fichier vers mon serveur, celui-ci étant d"coupé en plusieurs morceaux car il est très volumineux !

    Imaginons que nous envoyons 5 fichier .sdf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mon_fichier.sdf.part1
    mon_fichier.sdf.part2
    mon_fichier.sdf.part3
    mon_fichier.sdf.part4
    mon_fichier.sdf.part5
    voici mon fichier ICheckpointWebService.cs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Text;
     
    namespace CheckpointWebWcfService
    {
        [ServiceContract]
        public interface ICheckpointWebService
        {
            [OperationContract]
            void UploadFile(RemoteFileInfo request);
        }
     
        [MessageContract]
        public class RemoteFileInfo : IDisposable
        {
            [MessageHeader(MustUnderstand = true)]
            public string FileName;
     
            [MessageHeader(MustUnderstand = true)]
            public long Length;
     
            [MessageBodyMember(Order = 1)]
            public System.IO.Stream FileByteStream;
     
            public void Dispose()
            {
                if (FileByteStream != null)
                {
                    FileByteStream.Close();
                    FileByteStream = null;
                }
            }
        }
    }
    et mon fichier CheckpointWebServiceImpl.svc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Text;
     
    namespace CheckpointWebWcfService
    {
        public class CheckpointWebServiceImpl : ICheckpointWebService
        {
            public void UploadFile(RemoteFileInfo request)
            {
                FileStream targetStream = null;
                Stream sourceStream = request.FileByteStream;
                string filePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "TemporaryFiles", request.FileName);
     
                using (targetStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    const int bufferLen = XXX;
                    byte[] buffer = new byte[bufferLen];
     
                    // ...
     
                    targetStream.Close();
                    sourceStream.Close();
                }
            }
        }
    }
    Bon, voilà ce que je comptais faire :
    - Je transfère des fichiers par morceaux de X Mo maximum.
    - Je les copie dans un répertoire de fichiers temporaires sur mon serveur (TemporaryFiles).
    - Si un morceau fait moins de X Mo, soit il s'agit du dernier fichier, soit il s'agit d'un fichier qui était assez petit pour ne pas être découpé.
    - Une fois qu'ils sont tous transférés, je le recolle et je les transfère dans un autre dossier où ils seront stockés.

    Quelle est la taille d'un fichier souhaitée pour un transfert optimal ? 9a représente quoi pour la taille du buffer ?
    Comment enregistrer un fichier temporaire ?
    Comment recoller mes fichiers temporaires ?


    Merci .

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Pourquoi pas te tourner vers le streaming ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut
    pourquoi pas ? Le problème c'est que je n'en ai jamais fais. Mais je suis tout à faire preneur !!
    As-tu un bout de code à me proposer ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Malheureusement non car je n'en ai jamais eu besoin donc je n'ai jamais fait. Mais j'ai pu voir à droite à gauche qu'à priori c'est surtout une façon de paramétrer ton webservice lui permettant de transferer les données par streaming et non par systeme de message. Mais là, je ne voudrais pas trop m'avancer là dessus. Je te conseille juste de regarder un coup sur google à propos de WCF Webservice et le streaming

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut
    Attention, je crois qu'il y a un malentendu ! Le webservice n'envoie pas de chier, il en reçoit. ça marche toujours donc ?
    je vais me renseigner de ce pas ! merci.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par thor76160 Voir le message
    [B]Quelle est la taille d'un fichier souhaitée pour un transfert optimal ? 9a représente quoi pour la taille du buffer ?
    Il peut être intéressant de lire ça.

    Citation Envoyé par thor76160 Voir le message
    Comment enregistrer un fichier temporaire ?
    Sois un peu plus précis. Sinon dans ton cas tu reçois un flux, alors tu crées un fichier portant le même nom et tu écris le flux dedans.

    Citation Envoyé par thor76160 Voir le message
    Comment recoller mes fichiers temporaires ?
    WCF n'est pas fait pour ce genre de trucs. D'ailleurs tu dis que les fichiers ont été découpés donc normalement le logiciel qui a servi à découper ton fichier en petits morceaux doit pourvoir les recoller non

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut
    WCF n'est pas fait pour ce genre de trucs. D'ailleurs tu dis que les fichiers ont été découpés donc normalement le logiciel qui a servi à découper ton fichier en petits morceaux doit pourvoir les recoller non
    Merci pour ta réponse. A vrai dire, je ne sais pas comment les fichiers ont été découpés. Un de mes collègues s’occupe de cette partie. Pour les recoller, cette étape doit être réalisée automatiquement.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Peux-t-on savoir la ou les problématiques qui vous ont poussé à vouloir découper le fichier avant d'effectuer son transfert via le net ?

    Question bête : le fichier sdf n'est pas un fichier en rapport avec une base de données ?

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut
    Si tout à fait ! C'est pour réaliser des import de bases de données provenant d'un bon milliers de clients (je crois, et ça fait déjà pas mal) de notre entreprise.
    Si un client a une base de plusieurs giga, ça fait déjà bien mal durant le transfert ! ^^

    Pour le découpage, je pense que le fichier est découpé au niveau du buffer chez le client. et moi je le reconstitue à partir des différents morceaux.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Dans ce cas, voilà comment je verrais les choses personnellement :
    Une entrée webservice qui attend le flux de bytes (+ quelques infos permettant d'identifier le client histoire de pas mélanger les morceaux de fichiers entre clients).
    Pour le recollage de fichiers :
    - Soit ton collègue code la partie recollage de fichiers et te la file pour que tu l'intègres à ton webservice
    - Soit tu la codes toi même mais de toute façon tu auras besoin de ton collègue pour ca.

    Vu la taille des bases (tu parles de Gigas), il faut que tu t'assures de plusieurs choses :
    - 1) la limite max en upload de ton webservice qui conditionnera la taille des morceaux de fichiers
    - 2) fais en sorte que ton collègue envoie un checksum du fichier histoire que tu puisses verifier que ton morceau est bien intègre quand celui ci est reçu.
    - 3) Il doit également envoyer l'information comme quoi il t'envoie le dernier morceau de fichier pour que tu puisses lancer la reconstitution parce que la déduction sur la taille de fichier n'est pas géniale pour plusieurs raisons :
    -- il se peut qu'un fichier soit découpé pile poil pour que le dernier morceau fasse exactement la taille d'un morceau complet du coup tu ne sais pas si t'es au milieu des morceaux de fichier ou bien à la fin
    -- si un jour tu changes la taille des tes morceaux il faudra que tu penses à repasser dans ton code à cet endroit pour modifier la condition
    - 4) tu devras renvoyer une reponse à la partie appelante que ton collègue code pour lui dire que tu as bien reçu le fichier, que le checksum est ok et qu'il peut continuer à t'envoyer la suite

    Par contre je ne sais pas si tu as conscience de ce que ca implique qu'un client transfere quelques gigas par le net... c'est juste énormissime, ca risque de prendre un temps monstre, sans parler des possibilités d'erreurs...

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par thor76160 Voir le message
    Si tout à fait ! C'est pour réaliser des import de bases de données provenant d'un bon milliers de clients (je crois, et ça fait déjà pas mal) de notre entreprise.
    Si un client a une base de plusieurs giga, ça fait déjà bien mal durant le transfert ! ^^
    Vu que ce sont des bases de données qui sont en jeu ici alors la bonne pratique voudrait qu'on pense à la synchronisation des données. Plusieurs outils existent pour t'aider dans cette tâche comme Sync Framework ou certains trucs de BI.

    Citation Envoyé par thor76160 Voir le message
    Pour le découpage, je pense que le fichier est découpé au niveau du buffer chez le client. et moi je le reconstitue à partir des différents morceaux.
    Pour recoller alors ce sera simple il suffit d'écrire dans un fichier globale regroupant chaque morceau. Chaque morceau commence à écrire à la position où le précédent s'est arrêté. Pense à la synchronisation dont je parle dans le précédent paragraphe.

Discussions similaires

  1. download et upload des fichier avec JSP & mysql
    Par MSM_007 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 17/07/2006, 15h20
  2. upload des fichiers dans mon serveur
    Par abdou.sahraoui dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 29/05/2006, 09h32
  3. Réponses: 2
    Dernier message: 22/05/2006, 00h07
  4. upload des fichiers
    Par abdou.sahraoui dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 19/04/2006, 07h02
  5. Uploader des fichiers via ssh
    Par Michaël dans le forum Réseau
    Réponses: 3
    Dernier message: 13/05/2005, 20h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo