Comment télécharger des fichiers via l'API ?

J’essaie de comprendre comment autoriser le téléchargement de fichiers via l’API. J’ai vu ce post utile : How to upload a file via API and get it's URL? - #3 by Daniil_Bazhenov,

mais il ne donne pas la syntaxe réelle — et c’est là que je bloque. Quelqu’un a-t-il la syntaxe exacte pour l’appel AJAX ?

Voici ce que j’ai :

 method: "post",
      url: [site]/uploads.json,
      contentType: "multipart/form-data",
      data: {
        type: "composer",
        file: '/path_to_file_from_users_machine'
      },
      headers: {
        "User-Api-Key": key
      },
      dataType: "json",
    }).then((result)=>{

Mais cela renvoie une réponse 422 — il y a quelque chose qui ne va pas dans cette syntaxe. Comment puis-je faire en sorte que cela fonctionne ?

1 « J'aime »

Y a-t-il un message associé à cette réponse ? Cela devrait vous fournir plus d’informations.

À ma connaissance, voici la seule réponse :
Error: Request failed with status code 422

Et je ne vois rien dans les journaux.

Voici un exemple Node qui a fonctionné pour quelqu’un et qui pourrait vous aider :

Merci beaucoup, @blake. C’est un post utile que je n’avais pas vu auparavant (malgré mes recherches pour en trouver un similaire). Cela m’aidera certainement à avancer. Cependant, une chose a attiré mon attention. Cette ligne dans le code lié :
const file = fs.readFileSync(filename);

Cette ligne implique que ce que vous téléversez sur Discourse n’est pas réellement le fichier lui-même, mais le contenu du fichier (dans le code ci-dessus, la variable file correspond à la chaîne de caractères renvoyée par la lecture du fichier). Cela me surprend, et je me demande ce que cela signifie pour le téléversement de fichiers binaires (ou de fichiers multimédias — qui se téléversent correctement directement sur Discourse si la taille est acceptable, mais je ne suis pas sûr de comment procéder en les lisant au préalable).

Mais je vais vérifier cela.

1 « J'aime »

Salut à tous, après quelques difficultés et essais, j’ai pensé partager un exemple PHP qui fonctionne pour téléverser des fichiers sur Discourse ! Voici. De plus, j’ai créé une bibliothèque mise à jour à l’origine de communiteq/discourse-api-php: Client API PHP pour Discourse (github.com) :

<?php
	
	$curl = curl_init();
	
	curl_setopt_array($curl, array(
		CURLOPT_URL => 'https://example.com/uploads.json',
		CURLOPT_RETURNTRANSFER => true,
		CURLOPT_ENCODING => '',
		CURLOPT_MAXREDIRS => 10,
		CURLOPT_TIMEOUT => 0,
		CURLOPT_FOLLOWLOCATION => true,
		CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
		CURLOPT_CUSTOMREQUEST => 'POST',
		CURLOPT_POSTFIELDS => array(
			'type' => 'composer',
			'synchronous' => 'true',
			'file' => new CURLFILE('/directory/filename.txt')),
		CURLOPT_HTTPHEADER => array(
			'Content-Type: multipart/form-data',
			'Accept: application/json',
			'Api-Key: <votre clé api>',
			'Api-Username: <votre identifiant utilisateur api>'
		),
	));
	
	$response = curl_exec($curl);
	$info = curl_getinfo($curl);
	curl_close($curl);
	print_r(json_decode($response,1));
	print_r($info);
?>

Exemple de sortie :

Array
(
    [id] => 627
    [url] => https://example.com/uploads/default/original/1X/4661e3a873857e04440bcc3e4290e241eb6c08d7.txt
    [original_filename] => filename.txt
    [filesize] => 461
    [width] => 
    [height] => 
    [thumbnail_width] => 
    [thumbnail_height] => 
    [extension] => txt
    [short_url] => upload://a2D9hHsjwsdrVWkzlu5Go4c1VvV.txt
    [short_path] => /uploads/short-url/a2D9hHsjwsdrVWkzlu5Go4c1VvV.txt
    [retain_hours] => 
    [human_filesize] => 461 Bytes
    [dominant_color] => 
    [thumbnail] => 
)
Array
(
    [url] => https://example.com/uploads.json
    [content_type] => application/json; charset=utf-8
    [http_code] => 200
    [header_size] => 422
    [request_size] => 1244
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.029617
    [namelookup_time] => 0.00046
    [connect_time] => 0.003265
    [pretransfer_time] => 0.003592
    [size_upload] => 911
    [size_download] => 460
    [speed_download] => 15531
    [speed_upload] => 30759
    [download_content_length] => 460
    [upload_content_length] => 911
    [starttransfer_time] => 0.029604
    [redirect_time] => 0
    [redirect_url] => 
    [primary_ip] => 192.168.192.40
    [certinfo] => Array
        (
        )

    [primary_port] => 80
    [local_ip] => 192.168.192.18
    [local_port] => 61613
    [http_version] => 2
    [protocol] => 1
    [ssl_verifyresult] => 0
    [scheme] => http
    [appconnect_time_us] => 0
    [connect_time_us] => 3265
    [namelookup_time_us] => 460
    [pretransfer_time_us] => 3592
    [redirect_time_us] => 0
    [starttransfer_time_us] => 29604
    [total_time_us] => 29617
    [effective_method] => POST
    [capath] => 
    [cainfo] => 
)

J’ai également reçu une ÉNORME aide des exemples Postman ici : Creates an upload | Discourse | Postman API Network

Santé

5 « J'aime »