Upload un fichier dans une sous-tâche

Bonjour, je rencontre une difficulté à upload une image dans une sous-tâche Asana
Est-ce que je dois d’abord upload l’image sur mon serveur ?
Voici le code :

  $filename = $_FILES['file']['name'];
$curlfinalname = '@' . realpath ($filename);
    $curl2 = curl_init();
    $data_array2 = '{
            "data": {
                "file": "'.$curlfinalname.'"
            }
        }';

        $CURLHTTPHeader2 = array(
     "Content-Type: multipart/form-data",
    'Authorization: Bearer token');

    curl_setopt($curl2, CURLOPT_POST, 1);
    curl_setopt($curl2, CURLOPT_URL, 'https://app.asana.com/api/1.0/tasks/'.$result_id.'/attachments');
    curl_setopt($curl2, CURLOPT_HTTPHEADER, $CURLHTTPHeader2);
    curl_setopt($curl2, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl2, CURLOPT_POSTFIELDS, $data_array2);

    $result2 = curl_exec($curl2);

Merci d’avance pour votre aide.

Bonjour @anon58190593 et bienvenue!

Je suis désolée d’apprendre que vous rencontrez ce problème.

Afin de comprendre d’où vient le problème, pouvez-vous me confirmer que les images font moins de 100Mb et que vous les téléchargez depuis votre ordinateur et non depuis un service tiers ?

Vous pouvez consulter cet article sur le téléchargement via l’API: Upload an attachment

Je vous recommande également de consulter notre Forum des
développeurs et des API : Developers & API - Asana Community Forum

L’upload d’image via l’API est trèèèèèèès compliqué, j’ai mis un moment avant d’y arriver. J’ai du code en nodeJS qui le fait si jamais ça peut aider…

Bonjour Bastien , je veux bien s’il te plait. Merci

Bonjour, les images font bien moins de 100mb.
J’ envoi les images dans un formulaire en Ajax. Je récupère ensuite les images en PHP $_FILES.
Est-ce que je dois d’abord les héberger sur mon serveur et ensuite donner le chemin pour les héberger sur Asana ?

Merci d’avance pour votre réponse.

Pas besoin de les héberger, mais la syntaxe est difficile. Je partage le code dès que j’ai un moment.

1 Like

Je stocke mes images en base64, et j’utilise cette méthode pour transformer en fichier avant envoi

  base64ToFile(dataurl, filename) {
    const arr = dataurl.split(',')
    const mime = arr[0].match(/:(.*?);/)[1]
    const bstr = atob(arr[1])
    let n = bstr.length
    const u8arr = new Uint8Array(n)
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n)
    }
    return new File([u8arr], filename, {type: mime})
  }

et voilà la fonction d’envoi

const formData = new FormData()
    const file = this.base64ToFile(fileAsBase64, filename)
    formData.append('file', file)
    return this.http.post(`https://app.asana.com/api/1.0/tasks/${taskGid}/attachments`, formData,
      {
        headers: {
          'Authorization': 'Bearer ' + localStorage.getItem('access_token')
        }
      }).pipe(map(ret => new Attachment(ret)))

Pas si dur au final :stuck_out_tongue:

1 Like

Oula je ne comprends pas grand chose à vrai dire.
De plus je dois le traduire en php.

Mais merci :slight_smile:

Le plus important c’est d’avoir le endpoint appelé, le header passé et le fait qu’on utilise un formData. Je ne peux pas aider davantage ! (sauf à en faire une prestation où je le code pour vous)

1 Like