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 @Mathieu_Escos 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: Asana

Je vous recommande également de consulter notre Forum des
développeurs et des API : https://forum.asana.com/c/developersAPI/24

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