Wie man Dateien über die API hochlädt?

Ich versuche herauszufinden, wie man Datei-Uploads über die API erlaubt. (Discourse API Docs) Ich habe diesen hilfreichen Beitrag gesehen: How to upload a file via API and get it's URL? - #3 by Daniil_Bazhenov,

aber er liefert nicht die tatsächliche Syntax – und genau damit habe ich Schwierigkeiten. Hat jemand die tatsächliche Syntax für den Ajax-Aufruf?

So sieht mein aktueller Code aus:

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

Dabei erhalte ich jedoch eine 422-Antwort – an der Syntax stimmt etwas nicht. Wie kann ich das zum Laufen bringen?

1 „Gefällt mir“

Gibt es eine Nachricht, die zu dieser Antwort gehört? Das sollte dir weitere Informationen liefern.

Soweit ich das überblicke, ist dies die einzige Antwort:
Error: Request failed with status code 422

Und in den Logs sehe ich nichts.

Hier ist ein Node-Beispiel, das jemand zum Laufen gebracht hat und das vielleicht hilft:

Vielen Dank, @blake. Das ist ein hilfreicher Beitrag, den ich bisher nicht gefunden hatte (obwohl ich nach einem solchen gesucht habe). Das wird mir sicher weiterhelfen. Etwas ist mir jedoch aufgefallen. Diese Zeile im verlinkten Code:

const file = fs.readFileSync(filename);

Diese Zeile impliziert, dass beim Upload nach Discourse nicht die Datei selbst, sondern deren Inhalt hochgeladen wird (im obigen Code entspricht die Variable file dem String, der beim Lesen der Datei zurückgegeben wird). Das überrascht mich, und ich frage mich, was das für das Hochladen von Binärdateien (oder Mediendateien) bedeutet – die werden zwar direkt nach Discourse hochgeladen (sofern die Größe in Ordnung ist), aber ich bin mir nicht sicher, wie das Lesen dieser Dateien im Vorhinein funktionieren soll.

Aber ich werde es mir ansehen.

1 „Gefällt mir“

Hallo zusammen, nach einigem Ringen und Ausprobieren dachte ich, ich teile ein PHP-Beispiel, das für den Upload von Dateien nach Discourse funktioniert! Hier ist es. Außerdem habe ich eine aktualisierte Bibliothek erstellt, die ursprünglich von communiteq/discourse-api-php: PHP API client for Discourse (github.com) stammt:

<?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: <dein API-Schlüssel>',
			'Api-Username: <deine API-Benutzer-ID>'
		),
	));
	
	$response = curl_exec($curl);
	$info = curl_getinfo($curl);
	curl_close($curl);
	print_r(json_decode($response,1));
	print_r($info);
?>

Beispielausgabe:

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

Auch die Beispiele aus den Postman-Samples hier haben mir SEHR geholfen: Creates an upload | Discourse | Postman API Network

Viele Grüße

5 „Gefällt mir“