Come caricare file tramite l'API?

Sto cercando di capire come abilitare il caricamento dei file tramite l’API. Ho visto questo utile post: How to upload a file via API and get it's URL? - #3 by Daniil_Bazhenov,

ma non fornisce la sintassi effettiva, ed è proprio quello con cui sto avendo difficoltà. Qualcuno ha la sintassi corretta per la chiamata ajax?

Questo è quanto ho finora:

 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)=>{

Ma questo restituisce una risposta 422: c’è qualcosa che non va nella sintassi. Come posso farla funzionare?

1 Mi Piace

C’è un messaggio associato alla risposta? Dovrebbe darti più informazioni.

Per quanto riesco a vedere, questa è l’unica risposta:
Error: Request failed with status code 422

E non vedo nulla nei log.

Ecco un esempio in Node.js che qualcuno ha fatto funzionare e che potrebbe essere d’aiuto:

Grazie mille, @blake. È un post utile che non avevo mai visto prima (nonostante avessi cercato qualcosa di simile). Mi aiuterà sicuramente a procedere. C’è però una cosa che ha attirato la mia attenzione. Questa riga nel codice collegato:
const file = fs.readFileSync(filename);

Questa riga implica che ciò che carichi su Discourse non sia effettivamente il file stesso, ma il contenuto del file (nel codice sopra, la variabile file = la stringa restituita dalla lettura del file). Questo mi sorprende e mi chiedo cosa significhi per il caricamento di file binari (o file multimediali, che vengono caricati correttamente su Discourse direttamente, se le dimensioni sono adeguate, ma non sono sicuro di come funzionerebbe leggerli prima).

Ma controllerò di persona.

1 Mi Piace

Ciao a tutti, dopo alcune difficoltà e tentativi, ho pensato di condividere un esempio PHP che funziona per caricare file su Discourse! Ecco qui. Inoltre, ho creato una libreria aggiornata originariamente da communiteq/discourse-api-php: PHP API client for Discourse (github.com):


	$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: <la tua chiave api>',
			'Api-Username: <il tuo id utente api>'
		),
	));

	$response = curl_exec($curl);
	$info = curl_getinfo($curl);
	curl_close($curl);
	print_r(json_decode($response,1));
	print_r($info);
?>

Output di esempio:

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] =>
)

Inoltre, ho ricevuto un ENORME aiuto con gli esempi dai campioni di Postman qui: Creates an upload | Discourse | Postman API Network

Saluti

5 Mi Piace