JQ331
23 Septiembre, 2021 13:36
1
Estoy tratando de averiguar cómo permitir la carga de archivos a través de la API. He visto este útil post: How to upload a file via API and get it's URL? - #3 by Daniil_Bazhenov ,
pero no proporciona la sintaxis real, y eso es con lo que estoy luchando. ¿Alguien tiene la sintaxis real para la llamada ajax?
Esto es lo que tengo:
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)=>{
Pero esto da una respuesta 422; algo no está del todo bien con esta sintaxis. ¿Cómo puedo hacer que funcione?
1 me gusta
RGJ
(Richard - Communiteq)
27 Septiembre, 2021 15:12
2
JQ331:
Respuesta 422
¿Hay algún mensaje que acompañe a la respuesta? Eso debería darte más información.
JQ331
27 Septiembre, 2021 16:01
3
Por lo que puedo ver, esta es la única respuesta:
Error: Request failed with status code 422
Y no veo nada en los registros.
blake
(Blake Erickson)
27 Septiembre, 2021 20:38
4
Aquí tienes un ejemplo en Node que alguien logró hacer funcionar y que podría ayudarte:
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 Septiembre, 2021 21:53
5
Muchas gracias, @blake . Es una publicación muy útil que no había visto antes (a pesar de haber buscado una similar). Sin duda, me ayudará a avanzar. Sin embargo, algo llamó mi atención: esta línea en el código enlazado:
const file = fs.readFileSync(filename);
Esta línea sugiere que lo que se sube a Discourse no es realmente el archivo en sí, sino su contenido (en el código anterior, la variable file equivale a la cadena devuelta al leer el archivo). Eso me sorprende y me pregunto qué implica para la subida de archivos binarios (o archivos multimedia, los cuales se suben sin problemas directamente a Discourse si el tamaño es adecuado, pero no estoy seguro de cómo funcionaría leerlos primero).
Pero lo revisaré.
1 me gusta
Hola a todos, después de algunas dificultades y prueba y error, pensé que compartiría una muestra de PHP que funciona para subir archivos a Discourse. Aquí la tienen. Además, he estado creando una biblioteca actualizada originalmente de communiteq/discourse-api-php: Cliente API de PHP para 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: <tu clave api>',
'Api-Username: <tu id de usuario api>'
),
));
$response = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);
print_r(json_decode($response,1));
print_r($info);
?>
Salida de ejemplo:
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] =>
)
También obtuve una ENORME ayuda con los ejemplos de las muestras de Postman aquí: Crea una carga | Discourse | Red de API de Postman
Saludos
5 Me gusta