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

Développement Web avec .NET Discussion :

Upload plusieurs fichiers "dans la même action". [Débutant]


Sujet :

Développement Web avec .NET

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 213
    Par défaut Upload plusieurs fichiers "dans la même action".
    Bonjour à tous,

    Je suis débutant dans le C# .Net et j'ai une demande qui m'a été faite sur un projet existant (que je ne maîtrise pas).

    Actuellement, le projet ce connecte en https et envoi (en plus du reste) un fichier avec le code suivant : (je vous met, ce qui me semble être l'endroit de l'envoi du fichier).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            public static WebResponse PostFile(Uri requestUri, NameValueCollection postData, string fileName, string fileContentType, string fileFieldName, CookieContainer cookies,  NameValueCollection headers)
            {
                using (FileStream fileData = File.Open
                (fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    return PostFile(requestUri, postData, fileData,
                fileName, fileContentType, fileFieldName, cookies,
                                    headers);
                }
            }



    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
     
     public static WebResponse PostFile(Uri requestUri, NameValueCollection postData, Stream fileData, string fileName, string fileContentType, string fileFieldName, CookieContainer cookies, NameValueCollection headers)
            {
                HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(requestUri);
     
                string ctype;
     
                fileContentType = string.IsNullOrEmpty(fileContentType)
                                      ? TryGetContentType(fileName, out ctype) ?
                        ctype : "application/octet-stream"
                                      : fileContentType;
     
                fileFieldName = string.IsNullOrEmpty(fileFieldName) ? "file" : fileFieldName;
     
                if (headers != null)
                {
                    // set the headers
                    foreach (string key in headers.AllKeys)
                    {
                        string[] values = headers.GetValues(key);
                        if (values != null)
                            foreach (string value in values)
                            {
                                webrequest.Headers.Add(key, value);
                            }
                    }
                }
                webrequest.Method = "POST";
                webrequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1";
                webrequest.KeepAlive = true;
     
                if (cookies != null)
                {
                    webrequest.CookieContainer = cookies;
                }
     
                string boundary = "-----------------------------" + DateTime.Now.Ticks.ToString
                            ("x", CultureInfo.InvariantCulture);
     
                webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
     
                StringBuilder sbHeader = new StringBuilder();
     
                // add form fields, if any
                if (postData != null)
                {
                    foreach (string key in postData.AllKeys)
                    {
                        string[] values = postData.GetValues(key);
                        if (values != null)
                            foreach (string value in values)
                            {
                                sbHeader.AppendFormat("--{0}\r\n", boundary);
                                sbHeader.AppendFormat("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n", key, value);
                            }
                    }
                }
     
                if (fileData != null)
                {
                    sbHeader.AppendFormat("--{0}\r\n", boundary);
                    sbHeader.AppendFormat("Content-Disposition: form-data; name=\"{0}\"; {1}\r\n", fileFieldName,
                                          string.IsNullOrEmpty(fileName)
                                              ?
                                                  ""
                                              : string.Format(CultureInfo.InvariantCulture,
                            "filename=\"{0}\"",
                                                              Path.GetFileName(fileName)));
     
                    sbHeader.AppendFormat("Content-Type: {0}\r\n\r\n", fileContentType);
                }
     
                byte[] header = Encoding.UTF8.GetBytes(sbHeader.ToString());
                byte[] footer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
                long contentLength = header.Length + (fileData != null ?
                    fileData.Length : 0) + footer.Length;
     
                webrequest.ContentLength = contentLength;
     
                using (Stream requestStream = webrequest.GetRequestStream())
                {
                    requestStream.Write(header, 0, header.Length);
     
     
                    if (fileData != null)
                    {
                        // write the file data, if any
                        byte[] buffer = new Byte[checked((uint)Math.Min(4096,
                            (int)fileData.Length))];
                        int bytesRead;
                        while ((bytesRead = fileData.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            requestStream.Write(buffer, 0, bytesRead);
                        }
                    }
     
                    // write footer
                    requestStream.Write(footer, 0, footer.Length);
     
                    return webrequest.GetResponse();
                }
            }



    Il faudrait que j'ajoute un fichier.

    En gros, je dois envoyer deux fichiers au lieux d'un, mais dans la même "request" (pas en deux fois) avec une seule return webrequest.GetResponse() .

    Vous serait-il possible de m'aider, me diriger, vers la solution.

    D'avance merci.


    D.

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 213
    Par défaut
    Bonjour,

    J'ai essayé de changer une des méthodes, mais j'ai une erreur, vous serait-il possible de m’éclairer.

    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
    125
    126
    public static WebResponse PostFile2(Uri requestUri, NameValueCollection postData, Stream fileData,Stream fileDataPj, string fileName,string fileNamePj, string fileContentType, string fileFieldName, string fileFieldNamePj, CookieContainer cookies, NameValueCollection headers)
            {
                HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(requestUri);
     
                string ctype;
     
                fileContentType = string.IsNullOrEmpty(fileContentType)
                                      ? TryGetContentType(fileName, out ctype) ?
                        ctype : "application/octet-stream"
                                      : fileContentType;
     
                fileFieldName = string.IsNullOrEmpty(fileFieldName) ? "file" : fileFieldName;
                fileFieldNamePj = string.IsNullOrEmpty(fileFieldNamePj) ? "file" : fileFieldNamePj;
     
                if (headers != null)
                {
                    // set the headers
                    foreach (string key in headers.AllKeys)
                    {
                        string[] values = headers.GetValues(key);
                        if (values != null)
                            foreach (string value in values)
                            {
                                webrequest.Headers.Add(key, value);
                            }
                    }
                }
                webrequest.Method = "POST";
                webrequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1";
                webrequest.KeepAlive = true;
     
                if (cookies != null)
                {
                    webrequest.CookieContainer = cookies;
                }
     
                string boundary = "-----------------------------" + DateTime.Now.Ticks.ToString("x", CultureInfo.InvariantCulture);
     
                webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
     
                StringBuilder sbHeader = new StringBuilder();
     
                // add form fields, if any
                if (postData != null)
                {
                    foreach (string key in postData.AllKeys)
                    {
                        string[] values = postData.GetValues(key);
                        if (values != null)
                            foreach (string value in values)
                            {
                                sbHeader.AppendFormat("--{0}\r\n", boundary);
                                sbHeader.AppendFormat("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n", key, value);
                            }
                    }
                }
     
                if (fileData != null)
                {
                    sbHeader.AppendFormat("--{0}\r\n", boundary);
                    sbHeader.AppendFormat("Content-Disposition: form-data; name=\"{0}\"; {1}\r\n", fileFieldName, string.IsNullOrEmpty(fileName) 
                        ? "" : string.Format(CultureInfo.InvariantCulture,
                          "filename=\"{0}\"",Path.GetFileName(fileName)));
     
                    sbHeader.AppendFormat("Content-Type: {0}\r\n\r\n", fileContentType);
                }
     
                /// Formatage du fichier pj.zip - v 1.2
                /// 
                if (fileDataPj != null)
                {
                    sbHeader.AppendFormat("--{0}\r\n", boundary);
                    sbHeader.AppendFormat("Content-Disposition: form-data; name=\"{0}\"; {1}\r\n", fileFieldNamePj, string.IsNullOrEmpty(fileNamePj)
                        ? "" : string.Format(CultureInfo.InvariantCulture,
                          "filename=\"{0}\"", Path.GetFileName(fileNamePj)));
     
                    sbHeader.AppendFormat("Content-Type: {0}\r\n\r\n", fileContentType);
                }
                /// Fin du Formatage du fichier pj.zip - v1.2
                ///
                byte[] header = Encoding.UTF8.GetBytes(sbHeader.ToString());
                byte[] footer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
                long contentLength = header.Length + (fileData != null ?
                    fileData.Length : 0) + footer.Length;
     
                webrequest.ContentLength = contentLength;
     
                using (Stream requestStream = webrequest.GetRequestStream())
                {
                    requestStream.Write(header, 0, header.Length);
     
     
                    if (fileData != null)
                    {
                        // write the file data, if any
                        byte[] buffer = new Byte[checked((uint)Math.Min(4096,
                            (int)fileData.Length))];
                        int bytesRead;
                        while ((bytesRead = fileData.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            requestStream.Write(buffer, 0, bytesRead);
                        }
                    }
     
                    /// Gestion du fichier pj.zip
                    /// 
                    if (fileDataPj != null)
                    {
                        // write the file data, if any
                        byte[] bufferPj = new Byte[checked((uint)Math.Min(4096,
                            (int)fileDataPj.Length))];
                        int bytesRead;
                        while ((bytesRead = fileDataPj.Read(bufferPj, 0, bufferPj.Length)) != 0)
                        {
                            requestStream.Write(bufferPj, 0, bytesRead);
                        }
                    }
                    /// Fin de la gesiton du fichier pj.zip
                    /// 
     
                    // write footer
                    requestStream.Write(footer, 0, footer.Length);
     
                    return webrequest.GetResponse();
                }
            }
    Voici le message d'erreur :

    An unhandled exception of type 'System.Net.ProtocolViolationException' occurred in System.dll

    Additional information: Les octets à écrire dans ce flux dépassent la taille des octets Content-Length spécifiés.


    En rapport au code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     if (fileDataPj != null)
                    {
                        // write the file data, if any
                        byte[] bufferPj = new Byte[checked((uint)Math.Min(4096,
                            (int)fileDataPj.Length))];
                        int bytesRead;
                        while ((bytesRead = fileDataPj.Read(bufferPj, 0, bufferPj.Length)) != 0)
                        {
                            requestStream.Write(bufferPj, 0, bytesRead);
                        }
                    }
    D'avance merci pour votre aide.


  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 213
    Par défaut
    En gros, j'ai ajouter un sbHeader avant le transfert de mon deuxième fichier et j'ai recalculer le contentLength.


    Des fois c'est pénible d'être [Debutant]


    D.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/09/2014, 16h35
  2. Réponses: 0
    Dernier message: 09/07/2014, 10h37
  3. Réponses: 11
    Dernier message: 10/05/2011, 09h21
  4. Réponses: 1
    Dernier message: 26/03/2009, 16h56
  5. Réponses: 5
    Dernier message: 07/09/2004, 17h38

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