2017-01-09 3 views
1

Ich habe auf die anderen Beispiele auf dieser Website verwiesen, aber einen großen Unterschied in meiner Methode gefunden. (Bitte haben Sie Geduld)Rally C#: Wie kann eine Sammlung von Anhängen hochgeladen und mit einer User Story verknüpft werden?

Ich versuche, über ein Verzeichnis von Dateien zu iterieren und jede Datei als Anhang hochzuladen und mit einer User Story zu verknüpfen. Ich kann jetzt nur eine Datei für eine User Story anhängen. Ich sehe, dass jede Anlage zu einer Basis 64 Zeichenfolge codiert werden muss und eine Größe in Bytes haben muss.

Hier ist mein Code so weit:

public void createUsWithAttachmentList(string workspace, string project, string userStoryName, string userStoryDescription) 
    { 

     //authentication 
     this.EnsureRallyIsAuthenticated(); 

     //DynamicJSONObject for AttachmentContent 
     DynamicJsonObject myAttachmentContent = new DynamicJsonObject(); 

     //Length calculated from Base64String converted back 
     int imageNumberBytes = 0; 

     //Userstory setup 
     DynamicJsonObject toCreate = new DynamicJsonObject(); 
     toCreate["Workspace"] = workspace; 
     toCreate["Project"] = project; 
     toCreate["Name"] = userStoryName; 
     toCreate["Description"] = userStoryDescription; 

     //Trying to get a list of all the file paths within a given directory, this directory would contain .png files that need to be associated to a user story. 
     string[] attachmentPath = Directory.GetFiles("C:\\Users\\user\\Desktop\\RallyAttachments"); 

Diese foreach-Schleife verwirrend ist. Ich versuche, über jede Datei im Verzeichnis zu iterieren, um es in eine Base64-Zeichenfolge zu konvertieren, und gleichzeitig die Anzahl der Bytes für jede Datei als ein int zu erhalten.

 foreach (string fileName in attachmentPath) 
     { 
      Image myImage = Image.FromFile(fileName); 
      string imageBase64String = imageToBase64(myImage, System.Drawing.Imaging.ImageFormat.Png); 
      imageNumberBytes = Convert.FromBase64String(imageBase64String).Length; 

      //I am stuck here to be exact because there are multiple imageBase64Strings due to the collection of files located inside the directory. AND the below line is wrong because I have a list of imageBase64Strings that were generated from iterating through the string[] attachmentPath. 
      myAttachmentContent[RallyField.content] = imageBase64String; 
     } 

     try 
     { 
      //create user story 
      CreateResult createUserStory = _api.Create(RallyField.attachmentContent, myAttachmentContent); 
      //create attachment 
      CreateResult myAttachmentContentCreateResult = _api.Create(RallyField.attachmentContent, myAttachmentContent); 
      String myAttachmentContentRef = myAttachmentContentCreateResult.Reference; 

      //DynamicJSONObject for Attachment Container 
      //I assume I would need a separate container for each file in my directory containing the attachments. 
      DynamicJsonObject myAttachment = new DynamicJsonObject(); 
      myAttachment["Artifact"] = createUserStory.Reference; 
      myAttachment["Content"] = myAttachmentContentRef; 
      myAttachment["Name"] = "AttachmentFromREST.png"; 
      myAttachment["Description"] = "Email Attachment"; 
      myAttachment["ContentType"] = "image/png"; 
      myAttachment["Size"] = imageNumberBytes; 

      //create & associate the attachment 
      CreateResult myAttachmentCreateResult = _api.Create(RallyField.attachment, myAttachment); 
      Console.WriteLine("Created User Story: " + createUserStory.Reference); 
     } 
     catch (WebException e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 

Anmerkung: Ich plane, diese Methode auf der Erweiterung entsprechend mehrere Dateitypen, und ich, was ich würde brauchen, um den Dateityp jeder Datei im Verzeichnis und gehen Sie zu unterstützen. Irgendwelche Ideen, wie man das schreibt?

Antwort

1

Sie haben alle Teile implementiert - wir müssen sie nur ein wenig verschieben. Erstellen Sie die Geschichte einmal am Anfang und erstellen Sie dann jedes Mal einen neuen AttachmentContent und einen neuen Anhang für jede Datei.

public void createUsWithAttachmentList(string workspace, string project, string userStoryName, string userStoryDescription) 
{ 

    //authentication 
    this.EnsureRallyIsAuthenticated(); 

    //Userstory setup 
    DynamicJsonObject toCreate = new DynamicJsonObject(); 
    toCreate["Workspace"] = workspace; 
    toCreate["Project"] = project; 
    toCreate["Name"] = userStoryName; 
    toCreate["Description"] = userStoryDescription; 

    //Create the story first 
    try 
    { 
     //create user story 
     CreateResult createUserStory = _api.Create(RallyField.userStory, toCreate); 


     //now loop over each file 
     string[] attachmentPath = Directory.GetFiles("C:\\Users\\user\\Desktop\\RallyAttachments"); 

     foreach (string fileName in attachmentPath) 
     { 
      //DynamicJSONObject for AttachmentContent 
      DynamicJsonObject myAttachmentContent = new DynamicJsonObject(); 
      Image myImage = Image.FromFile(fileName); 
      string imageBase64String = imageToBase64(myImage, System.Drawing.Imaging.ImageFormat.Png); 
      int imageNumberBytes = Convert.FromBase64String(imageBase64String).Length; 
      myAttachmentContent[RallyField.content] = imageBase64String; 

      //create the AttachmentConent 
      CreateResult myAttachmentContentCreateResult = _api.Create(RallyField.attachmentContent, myAttachmentContent); 
      String myAttachmentContentRef = myAttachmentContentCreateResult.Reference; 

      //create an Attachment to associate to story 
      DynamicJsonObject myAttachment = new DynamicJsonObject(); 
      myAttachment["Artifact"] = createUserStory.Reference; 
      myAttachment["Content"] = myAttachmentContentRef; 
      myAttachment["Name"] = "AttachmentFromREST.png"; 
      myAttachment["Description"] = "Email Attachment"; 
      myAttachment["ContentType"] = "image/png"; 
      myAttachment["Size"] = imageNumberBytes; 

      //create & associate the attachment 
      CreateResult myAttachmentCreateResult = _api.Create(RallyField.attachment, myAttachment); 
     }  
    } 
    catch (WebException e) 
    { 
     Console.WriteLine(e.Message); 
    } 
} 
+0

Ist es möglich, ein gezipptes Verzeichnis in Rally als Anhang zu schieben. Wenn ja, können Sie irgendwelche Hinweise geben. Ich fange an zu denken, dass es in Base 64 String codiert werden muss. –

+0

Eine ZIP-Datei ist ein gültiger Anhangstyp. Du hast Recht - der Inhalt muss basis4-kodiert sein. –

Verwandte Themen