0
votes

Corps multipart mal formé lors du téléchargement de fichier sur Google Drive

Avoir un peu de difficulté à essayer de résoudre le problème avec le téléchargement de fichier sur Google Drive en utilisant leur / téléchargement point final. Je continue à obtenir corps multipartail mal formé. Code> Erreur même lorsque j'essaie de télécharger du texte simple simple sous forme de fichier.

Le code C # suivant est utilisé pour créer la demande: p>

--not_so_random_boundary
Content-Type: application/json; charset=utf-8

Content-Disposition: form-data
{"name":"test.txt","mimeType":"text/plain","parents":["/*snip*/"]}

--not_so_random_boundary
Content-Type: text/plain

Content-Disposition: form-data
The quick brown fox jumps over the lazy dog
--not_so_random_boundary--


0 commentaires

3 Réponses :


2
votes

Je pense que la structure du corps de la demande pour multipart / associé code> pourrait ne pas être correcte. Alors, que diriez-vous de modifier comme suit?

Body Demande modifiée: H3>
--not_so_random_boundary
Content-Type: application/json; charset=utf-8
Content-Disposition: form-data; name="metadata"

{"name":"test.txt","mimeType":"text/plain","parents":["/*snip*/"]}
--not_so_random_boundary
Content-Type: text/plain
Content-Disposition: form-data; name="file"

The quick brown fox jumps over the lazy dog
--not_so_random_boundary--
  • S'il vous plaît soyez prudent la ligne de rupture pour le corps de la demande. LI>
  • Veuillez ajouter Nom code> pour chaque partie de Disposition du contenu code>. Li> ul>

    Remarque: h3>
    • Maintenant, je pourrais maintenant confirmer que lorsque le corps de la demande modifié est utilisé pour le point final de https://www.googleapis.com/dupload/drive/v3/files?uploadtype=multipart code> comme méthode postale , un fichier texte de test.txt code> qui a le contenu de le renard brun rapide saute sur le chien paresseux code> est créé. li> ul>

      Références: h3>


2 commentaires

Ajout de disposition de contenu en-tête avec nom = métadonnées a fixé le problème. Observation intéressante; Type de contenu L'en-tête ajouté à StreamContent est ignoré et MIMETYPE La propriété est utilisée.


@iiminov merci de l'avoir testé et de répondre. Je suis content que votre problème ait été résolu.



3
votes

Grâce à la suggestion de @tanaike, nous avons trouvé le problème avec mon code.

s'avère que cela n'est pas spécifiquement mentionné dans la documentation (ou des exemples de code) mais ajout de disposition de contenu: format-données; Nom = "Metadata" au StringContent La partie du corps de la demande fait toute la différence.

La demande finale peut être réécrite comme suit: < PRE> XXX

NOTE QUI NORMALEMENT AJOUTERA UN NOM DE FICHIER ET TYPE DE CONTENU SIGNALISTANT dans le cadre du STREGCONTENT Mais ces en-têtes sont ignorés par Google Drive API. Ceci est fait délibéralement car l'API prévoit de recevoir un objet de métadonnées avec des propriétés pertinentes. (Les en-têtes suivants ont été supprimés de l'exemple de code ci-dessus, mais seront conservés ici pour référence future) xxx

note que vous n'avez besoin que de spécifier "Parents": ["{folder_id}"] Propriété Si vous souhaitez télécharger un fichier sur un sous-dossier dans Google Drive.

J'espère que cela aide quelqu'un d'autre à l'avenir.


0 commentaires

0
votes

Une autre option serait d'utiliser la bibliothèque client Google .NET et de la laisser hurler le téléchargement pour vous.

// Upload file Metadata
var fileMetadata = new Google.Apis.Drive.v3.Data.File()
    {
    Name = "Test hello uploaded.txt",
    Parents = new List() {"10krlloIS2i_2u_ewkdv3_1NqcpmWSL1w"}
    };

string uploadedFileId;
// Create a new file on Google Drive
await using (var fsSource = new FileStream(UploadFileName, FileMode.Open, FileAccess.Read))
      {
      // Create a new file, with metadata and stream.
      var request = service.Files.Create(fileMetadata, fsSource, "text/plain");
      request.Fields = "*";
      var results = await request.UploadAsync(CancellationToken.None);

      if (results.Status == UploadStatus.Failed)
         {
         Console.WriteLine($"Error uploading file: {results.Exception.Message}");
         }

          // the file id of the new file we created
          uploadedFileId = request.ResponseBody?.Id;
      }


0 commentaires