JQ331
Setembro 23, 2021, 1:36pm
1
Estou tentando descobrir como permitir uploads de arquivos via API. Vi este post útil: How to upload a file via API and get it's URL? - #3 by Daniil_Bazhenov ,
mas ele não fornece a sintaxe real — e é nisso que estou tendo dificuldade. Alguém tem a sintaxe real para a chamada AJAX?
Isso é o que tenho:
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)=>{
Mas isso retorna uma resposta 422 — algo não está bem com essa sintaxe. Como posso fazer funcionar?
1 curtida
RGJ
(Richard - Communiteq)
Setembro 27, 2021, 3:12pm
2
JQ331:
Resposta 422
Há alguma mensagem associada à resposta? Isso deve fornecer mais informações.
JQ331
Setembro 27, 2021, 4:01pm
3
Pelo que posso ver, esta é a única resposta:
Error: Request failed with status code 422
E não vejo nada nos logs.
blake
(Blake Erickson)
Setembro 27, 2021, 8:38pm
4
Aqui está um exemplo em Node que alguém conseguiu fazer funcionar e que pode ajudar:
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
Setembro 27, 2021, 9:53pm
5
Muito obrigado, @blake . Esse é um post útil que eu não havia visto antes (apesar de ter procurado por um assim). Com certeza vai me ajudar a avançar. No entanto, algo chamou minha atenção. Esta linha no código vinculado:
const file = fs.readFileSync(filename);
Essa linha sugere que o que você envia para o Discourse não é realmente o arquivo em si, mas o conteúdo do arquivo (no código acima, a variável file = a string retornada pela leitura do arquivo). Isso me surpreendeu, e estou me perguntando o que isso significa para o envio de arquivos binários (ou arquivos de mídia — que são enviados sem problemas diretamente para o Discourse, se o tamanho estiver adequado, mas não tenho certeza de como funcionaria ler esses arquivos primeiro).
Mas vou verificar.
1 curtida
Olá a todos, depois de algumas dificuldades e tentativas e erros, pensei em compartilhar um exemplo de PHP que funciona para fazer upload de arquivos para o Discourse! Aqui está. Além disso, tenho criado uma biblioteca atualizada originalmente de communiteq/discourse-api-php: Cliente de API PHP para 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: <sua chave de api>',
'Api-Username: <seu id de usuário de api>'
),
));
$response = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);
print_r(json_decode($response,1));
print_r($info);
?>
Exemplo de Saída:
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] =>
)
Também obtive uma AJUDA ENORME com os exemplos das amostras do Postman aqui: Creates an upload | Discourse | Postman API Network
Abraços
5 curtidas