JQ331
23. September 2021 um 13:36
1
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“
RGJ
(Richard - Communiteq)
27. September 2021 um 15:12
2
JQ331:
422-Antwort
Gibt es eine Nachricht, die zu dieser Antwort gehört? Das sollte dir weitere Informationen liefern.
JQ331
27. September 2021 um 16:01
3
Soweit ich das überblicke, ist dies die einzige Antwort:
Error: Request failed with status code 422
Und in den Logs sehe ich nichts.
blake
(Blake Erickson)
27. September 2021 um 20:38
4
Hier ist ein Node-Beispiel, das jemand zum Laufen gebracht hat und das vielleicht hilft:
I got this to work, like this:
import Axios from "axios";
import FormData from "form-data";
import fs from "fs";
const http = Axios.create({
baseURL: "https://forum.zeebe.io",
headers: {
"Api-Key":
"...",
"Api-Username": "...",
"Content-Type": "application/json",
Accept: "application/json",
},
});
http.interceptors.request.use((config) => {
if (config.data instanceof FormData) {
Object.assign(config.headers, config.data.getHeaders());
}
return config;
});
…
JQ331
27. September 2021 um 21:53
5
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“