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

C# Discussion :

Upload fichier via REST


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut Upload fichier via REST
    Bonjour à tous,

    Je suis actuellement en train d'essayer d'uploader un fichier dans un document Nuxeo (5.4.0) via le service REST uploadFile.

    Voici mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    string endpoint = "http://.../nuxeo/restAPI/default/a041a81b-8fa1-465c-88d3-3a89cbd64e2a/yopla/uploadFile";
    WebClient webClient = new WebClient();
    webClient.Headers.Add("Rest-Method", "POST");
    webClient.Credentials = new NetworkCredential("Administrator", "Administrator");
    var resp = webClient.UploadFile(endpoint, @"D:\autre\lien_utile.txt");
    var response = Encoding.ASCII.GetString(resp);
    Console.WriteLine(response);
    J'obtiens en message de retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" encoding="UTF-8"?> 
    <error class="java.lang.NullPointerException"/>
    J'ai également essayé avec ce code :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
                    string endpoint = "http://.../nuxeo/restAPI/default/a041a81b-8fa1-465c-88d3-3a89cbd64e2a/yopla/uploadFile";
     
    FileStream rdr = new FileStream(@"C:\test\test.pdf", FileMode.Open);
     
                    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(endpoint);
                    req.Credentials = new NetworkCredential("Administrator", "Administrator");
                    req.Method = "POST";
                    req.ContentType = "multipart/form-data; boundary="+boundary;
                    req.ContentLength = rdr.Length;
                    req.AllowWriteStreamBuffering = true;
                    //req.KeepAlive = false;
     
                    Stream reqStream = req.GetRequestStream();
                    byte[] inData = new byte[rdr.Length];
     
                    int bytesRead = rdr.Read(inData, 0, (int)rdr.Length);
                    // put data into request stream
                    reqStream.Write(inData, 0, (int)rdr.Length);
                    rdr.Close();
     
                    // after uploading close stream 
                    reqStream.Close();
     
    public string GetMessage(HttpWebRequest request)
            {
                using (var response = (HttpWebResponse)request.GetResponse())
                {
                    var responseValue = string.Empty;
     
                    if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created)
                    {
                        string message = String.Format("POST failed. Received HTTP {0}", response.StatusCode);
                        throw new ApplicationException(message);
                    }
     
                    // grab the response  
                    using (var responseStream = response.GetResponseStream())
                    {
                        using (var reader = new StreamReader(responseStream))
                        {
                            responseValue = reader.ReadToEnd();
                        }
                    }
                    return responseValue;
                }
            }
    qui me renvoie le même message. Par contre si j'utilise l'API "upload" à la place de "uploadFile", ce code me renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" encoding="UTF-8"?> 
    <uploads/>
    Mais pas de différence dans Nuxeo...

    Je ne pense pas tombé sur de grand expert Nuxeo sur ce forum (si c'est le cas tant mieux ! ) mais au final c'est une requête Http, donc si quelqu'un a une idée quelconque sur la question...

    Merci d'avance.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Bonjour;
    J'ai bien vu qu'il s'agissait d'un vieux post mais à tu trouver la solution pour l'Upload du fichier dans un document nuxeo car j'ai le même souci, j'ai toujours des erreurs 500 suites à l'Upload d'un fichier, problème avec les boundary ou les entêtes donc si tu as trouvé je suis intéressé.

    À tu refait une automation client complet en C# ou juste pour Upload.

    Merci

  3. #3
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut
    Salut Ryann.

    Oui j'avais trouvé une solution me semble-t-il. Effectivement c'est un vieux Post mais je dois avoir un morceau de code quelque part... Je chercherai et je le posterai si trouvé en tout cas je te tiens au courant.

    Non je n'avais pas refait tout le client Automation complet en .net mais j'avais développé une bonne partie !! et le restant aurait pu être terminé assez facilement, ayant les 3/4 des fonctionnalités nécessaires.
    J'avais même été contacté par Nuxeo à l'époque pour terminer le développement d'un client en .net ou au moins rédiger une page d'aide sur leur site mais n'ayant en retour ni reconnaissance ni récompense quelconque j'avais décidé de ne pas donner suite.

    Bref, je me replongerai dans mes archives quand j'aurai un peu de temps !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Salut Air P-E,

    Merci de ton retour, je suis intéressé si tu retrouves du code je veux bien soit ici pour tout le monde ou en mp si tu préfères. Je refais aussi un bout de l'automation client 5.6, mais j'ai quelques difficultés et le doc nuxeo très limité dans les explications et exemples. j'attends de tes nouvelles, merci

    Cordialement,
    Ryann

  5. #5
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut
    Bon je me suis repenché dans mes archives, ça m'a fait bizare de rouvrir ces projets !

    Concernant la doc, je ne sais pas aujourd'hui mais à l'époque où je travaillais dessus, c'était effectivement très limité, surtout pour une utilisation hors API Nuxeo en Java.

    Pour l'upload d'un fichier dans un document Nuxeo, voici ce qu'il faut utiliser (d'après mes souvenirs... )

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    public static string BlobAttach(string path,
                                            string fileName,
                                            bool attachAsPrincipalFile)
            {
                string boundary = DateTime.Now.Ticks.ToString("x");
                return HttpPostRequest.SendMultiPart(Credentials,
                                                     BaseUrlNuxeo + Resources.BlobAttach,
                                                     NuxeoHeader.BlobAttach(fileName,
                                                                            path,
                                                                            boundary,
                                                                            attachAsPrincipalFile),
                                                     boundary,
                                                     Resources.TempAttachment + fileName);
            }
     
    public static string SendMultiPart(NetworkCredential credentials,
                                               string url,
                                               string header,
                                               string boundary,
                                               string filePath)
            {
                HttpWebRequest requestSendMultiPart = WebRequest.Create(url) as HttpWebRequest;
     
                if (requestSendMultiPart == null)
                    throw new NullReferenceException(string.Format(fr_lang.ERROR_uri_unreachable,
                                                                   url));
     
                requestSendMultiPart.Method = "POST";
                requestSendMultiPart.Accept = "application/json+nxentity, */*";
                requestSendMultiPart.ContentType = "multipart/related; type=\"application/json+nxrequest\"; start=\"request\"; charset=UTF-8\r\n";
                requestSendMultiPart.Headers.Add("X-NXVoidOperation: true");
                requestSendMultiPart.Credentials = credentials;
     
                var postHeaderBytes = Encoding.UTF8.GetBytes(header);
                var boundaryBytes = Encoding.ASCII.GetBytes(string.Format("\r\n--{0}--\r\n", boundary));
     
                FileStream fileStream = null;
                Stream responseStream = null;
                Stream requestStream = null;
                StreamReader responseStreamReader = null;
                try
                {
                    fileStream = new FileStream(filePath,
                                                FileMode.Open,
                                                FileAccess.Read);
                    // Ligne qui fait ralentir de 20 secondes le temps de réponse.
                    //requestSendMultiPart.ContentLength = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
     
                    requestStream = requestSendMultiPart.GetRequestStream();
                    requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
     
                    var buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
                    int bytesRead;
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                        requestStream.Write(buffer, 0, bytesRead);
     
                    fileStream.Close();
     
                    // Ajout du boundary de fin.
                    requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                    requestStream.Close();
     
                    responseStream = requestSendMultiPart.GetResponse().GetResponseStream();
                    if (responseStream == null)
                        throw new NullReferenceException(fr_lang.ERROR_no_response);
     
                    //StreamReader implémente TextReader qui lit les caractères à partir d'un flux d'octets dans un encodage particulier
                    responseStreamReader = new StreamReader(responseStream);
     
                    return responseStreamReader.ReadToEnd();
                }
                finally
                {
                    if (requestStream != null)
                        requestStream.Dispose();
     
                    if (fileStream != null)
                    {
                        fileStream.Close();
                        fileStream.Dispose();
                    }
     
                    if (responseStreamReader != null)
                    {
                        responseStreamReader.Close();
                        responseStreamReader.Dispose();
                    }
     
                    if (responseStream != null)
                    {
                        responseStream.Close();
                        responseStream.Dispose();
                    }
                }
     
    public static string BlobAttach(string fileName,
                                            string nuxeoPath,
                                            string boundary,
                                            bool attachAsPrincipalFile)
            {
                var header = new StringBuilder();
                header.AppendFormat("--{0}\r\n",
                                    boundary);
                header.Append("Content-Type: application/json+nxrequest; charset=UTF-8\r\n");
                header.Append("Content-Transfer-Encoding: 8bit\r\nContent-ID: request\r\n\r\n");
     
                if (attachAsPrincipalFile)
                    header.AppendFormat("{{\"params\":{{\"document\":\"{0}\"}},\"context\":{{}}}}",
                                        nuxeoPath);
                else
                    header.AppendFormat("{{\"params\":{{\"document\":\"{0}\",\"xpath\":\"files:files\"}},\"context\":{{}}}}",
                                        nuxeoPath);
     
                header.AppendFormat("\r\n\r\n--{0}\r\n",
                                    boundary);
                header.AppendFormat("Content-Type: {0}\r\n",
                                    FileType.GetMimeTypeFromFile(fileName));
                header.Append("Content-Transfert-Encoding: binary\r\n");
                header.AppendFormat("Content-Disposition: attachment; filename=\"{0}\";\r\n",
                                    fileName);
                header.Append("Content-ID: input\r\n\r\n");
     
                return header.ToString();
            }
    Voilà je t'ai mis un peu tout en vrac mais je pense que tu devrais t'y retrouver !

    Si tu as des incompréhensions ou des questions n'hésites surtout pas !

    Le plus important à comprendre pour l'envoi de document c'est l'utilisation de ce qu'on appelle des requête multi-part. Pour le header, je galérais beaucoup à chaque nouvelle fonction car des fois c'est des trucs que tu peux pas inventer, je faisais beaucoup de tests et de recherches...

    Le code est très probablement sujet à des améliorations. De plus j'espère que ça fonctionne toujours de la même manière pour la version 5.6.0 de Nuxeo. En tout cas ça devrait t'aider je pense.

    Bonne chance !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Merci de ta réponse, oui effectivement j'ai trouvé une méthode différente pour y arriver mais ce na pas été évident pour le multipart, je vais regarder ce que tu as faits et peut-être améliorer une peu ma version.
    Sinon une autre question pour traiter le json tu utilisais quelle librairie ?
    moi Json.net mais quand je serialize mes objets elle a tendance à rajouter plein de \ d'échappement parfois jusqu'à \\\\ et la seule méthode que j'ai trouvée et de faire des replace de ma chaîne après serialization pour les enlever, si tu as aussi réfléchi à ce problème.

    Cordialement

    Ryann

  7. #7
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut
    Content que tu ais pu avancer !

    Concernant le json, oui de souvenir j'utilisais cette librairie aussi et je me souviens avoir traiter exactement ce genre de problème de manière générale. Je faisais le même traitement que toi.
    En même temps j'ai du mal à voir quelle autre solution utiliser pour gérer ce cas et je n'avais pas chercher plus loin quand je voyais que cette solution fonctionnait. Je n'avais pas spécialement le temps d'investiguer davantage sur ces petits problèmes.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    merci bien de ton aide je reviendrais vers toi si j'ai d'autres soucis mais je pense que c'est bon.

    bonne journée

Discussions similaires

  1. [cURL] Upload fichier via FTP
    Par flashy38 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 24/02/2009, 13h23
  2. Erreur upload fichier via formulaire
    Par Telecaster dans le forum Langage
    Réponses: 2
    Dernier message: 05/02/2009, 11h30
  3. upload fichiers via la méthode POST
    Par shiin dans le forum Réseau
    Réponses: 3
    Dernier message: 20/02/2007, 10h54
  4. [Upload] Problème Upload Fichiers via html
    Par Typhon dans le forum Langage
    Réponses: 3
    Dernier message: 11/02/2007, 11h52
  5. [Web] Upload fichier via formulaire HTTP
    Par nik00s dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 11/08/2005, 12h27

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