curl -X POST 'https://upload.xbrod.com/v1/upload' \
-H 'Authorization: Bearer <token>' \
-F 'files=@/path/to/reference.png'
import requests
with open('/path/to/reference.png', 'rb') as image:
response = requests.post('https://upload.xbrod.com/v1/upload',
headers={'Authorization': 'Bearer <token>'}, files={'files': image})
print(response.json())
import { openAsBlob } from 'node:fs';
const form = new FormData();
form.append('files', await openAsBlob('/path/to/reference.png'), 'reference.png');
const response = await fetch('https://upload.xbrod.com/v1/upload', {
method: 'POST',
headers: { Authorization: 'Bearer <token>' },
body: form,
});
console.log(await response.json());
package main
import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
"path/filepath"
)
func main() {
file, err := os.Open("/path/to/reference.png")
if err != nil { panic(err) }
defer file.Close()
var body bytes.Buffer
writer := multipart.NewWriter(&body)
part, err := writer.CreateFormFile("files", filepath.Base(file.Name()))
if err != nil { panic(err) }
if _, err := io.Copy(part, file); err != nil { panic(err) }
if err := writer.Close(); err != nil { panic(err) }
req, err := http.NewRequest("POST", "https://upload.xbrod.com/v1/upload", &body)
if err != nil { panic(err) }
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", writer.FormDataContentType())
resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer resp.Body.Close()
result, err := io.ReadAll(resp.Body)
if err != nil { panic(err) }
fmt.Println(string(result))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.UUID;
public class Example {
public static void main(String[] args) throws Exception {
var file = Path.of("/path/to/reference.png");
var boundary = "----xbrod-" + UUID.randomUUID();
var header = ("--" + boundary + "\r\nContent-Disposition: form-data; name=\"files\"; filename=\"" +
file.getFileName() + "\"\r\nContent-Type: image/png\r\n\r\n").getBytes(StandardCharsets.UTF_8);
var footer = ("\r\n--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8);
var body = HttpRequest.BodyPublishers.ofByteArrays(List.of(header, Files.readAllBytes(file), footer));
var request = HttpRequest.newBuilder(URI.create("https://upload.xbrod.com/v1/upload"))
.header("Authorization", "Bearer <token>")
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(body).build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
<?php
$ch = curl_init('https://upload.xbrod.com/v1/upload');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer <token>'],
CURLOPT_POSTFIELDS => ['files' => new CURLFile('/path/to/reference.png')],
CURLOPT_RETURNTRANSFER => true,
]);
$result = curl_exec($ch);
if ($result === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
echo $result;
require 'net/http'
uri = URI('https://upload.xbrod.com/v1/upload')
File.open('/path/to/reference.png', 'rb') do |image|
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer <token>'
request.set_form([['files', image]], 'multipart/form-data')
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') { |http| http.request(request) }
puts response.body
end
{
"status": "<string>",
"files": [
{
"index": 123,
"status": "<string>",
"url": "<string>",
"bytes": 123,
"content_type": "<string>"
}
]
}上传管理
上传文件
上传图片文件并获取地址。
POST
/
v1
/
upload
curl -X POST 'https://upload.xbrod.com/v1/upload' \
-H 'Authorization: Bearer <token>' \
-F 'files=@/path/to/reference.png'
import requests
with open('/path/to/reference.png', 'rb') as image:
response = requests.post('https://upload.xbrod.com/v1/upload',
headers={'Authorization': 'Bearer <token>'}, files={'files': image})
print(response.json())
import { openAsBlob } from 'node:fs';
const form = new FormData();
form.append('files', await openAsBlob('/path/to/reference.png'), 'reference.png');
const response = await fetch('https://upload.xbrod.com/v1/upload', {
method: 'POST',
headers: { Authorization: 'Bearer <token>' },
body: form,
});
console.log(await response.json());
package main
import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
"path/filepath"
)
func main() {
file, err := os.Open("/path/to/reference.png")
if err != nil { panic(err) }
defer file.Close()
var body bytes.Buffer
writer := multipart.NewWriter(&body)
part, err := writer.CreateFormFile("files", filepath.Base(file.Name()))
if err != nil { panic(err) }
if _, err := io.Copy(part, file); err != nil { panic(err) }
if err := writer.Close(); err != nil { panic(err) }
req, err := http.NewRequest("POST", "https://upload.xbrod.com/v1/upload", &body)
if err != nil { panic(err) }
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", writer.FormDataContentType())
resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer resp.Body.Close()
result, err := io.ReadAll(resp.Body)
if err != nil { panic(err) }
fmt.Println(string(result))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.UUID;
public class Example {
public static void main(String[] args) throws Exception {
var file = Path.of("/path/to/reference.png");
var boundary = "----xbrod-" + UUID.randomUUID();
var header = ("--" + boundary + "\r\nContent-Disposition: form-data; name=\"files\"; filename=\"" +
file.getFileName() + "\"\r\nContent-Type: image/png\r\n\r\n").getBytes(StandardCharsets.UTF_8);
var footer = ("\r\n--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8);
var body = HttpRequest.BodyPublishers.ofByteArrays(List.of(header, Files.readAllBytes(file), footer));
var request = HttpRequest.newBuilder(URI.create("https://upload.xbrod.com/v1/upload"))
.header("Authorization", "Bearer <token>")
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(body).build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
<?php
$ch = curl_init('https://upload.xbrod.com/v1/upload');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer <token>'],
CURLOPT_POSTFIELDS => ['files' => new CURLFile('/path/to/reference.png')],
CURLOPT_RETURNTRANSFER => true,
]);
$result = curl_exec($ch);
if ($result === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
echo $result;
require 'net/http'
uri = URI('https://upload.xbrod.com/v1/upload')
File.open('/path/to/reference.png', 'rb') do |image|
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer <token>'
request.set_form([['files', image]], 'multipart/form-data')
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') { |http| http.request(request) }
puts response.body
end
{
"status": "<string>",
"files": [
{
"index": 123,
"status": "<string>",
"url": "<string>",
"bytes": 123,
"content_type": "<string>"
}
]
}curl -X POST 'https://upload.xbrod.com/v1/upload' \
-H 'Authorization: Bearer <token>' \
-F 'files=@/path/to/reference.png'
import requests
with open('/path/to/reference.png', 'rb') as image:
response = requests.post('https://upload.xbrod.com/v1/upload',
headers={'Authorization': 'Bearer <token>'}, files={'files': image})
print(response.json())
import { openAsBlob } from 'node:fs';
const form = new FormData();
form.append('files', await openAsBlob('/path/to/reference.png'), 'reference.png');
const response = await fetch('https://upload.xbrod.com/v1/upload', {
method: 'POST',
headers: { Authorization: 'Bearer <token>' },
body: form,
});
console.log(await response.json());
package main
import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
"path/filepath"
)
func main() {
file, err := os.Open("/path/to/reference.png")
if err != nil { panic(err) }
defer file.Close()
var body bytes.Buffer
writer := multipart.NewWriter(&body)
part, err := writer.CreateFormFile("files", filepath.Base(file.Name()))
if err != nil { panic(err) }
if _, err := io.Copy(part, file); err != nil { panic(err) }
if err := writer.Close(); err != nil { panic(err) }
req, err := http.NewRequest("POST", "https://upload.xbrod.com/v1/upload", &body)
if err != nil { panic(err) }
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", writer.FormDataContentType())
resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer resp.Body.Close()
result, err := io.ReadAll(resp.Body)
if err != nil { panic(err) }
fmt.Println(string(result))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.UUID;
public class Example {
public static void main(String[] args) throws Exception {
var file = Path.of("/path/to/reference.png");
var boundary = "----xbrod-" + UUID.randomUUID();
var header = ("--" + boundary + "\r\nContent-Disposition: form-data; name=\"files\"; filename=\"" +
file.getFileName() + "\"\r\nContent-Type: image/png\r\n\r\n").getBytes(StandardCharsets.UTF_8);
var footer = ("\r\n--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8);
var body = HttpRequest.BodyPublishers.ofByteArrays(List.of(header, Files.readAllBytes(file), footer));
var request = HttpRequest.newBuilder(URI.create("https://upload.xbrod.com/v1/upload"))
.header("Authorization", "Bearer <token>")
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(body).build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
<?php
$ch = curl_init('https://upload.xbrod.com/v1/upload');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer <token>'],
CURLOPT_POSTFIELDS => ['files' => new CURLFile('/path/to/reference.png')],
CURLOPT_RETURNTRANSFER => true,
]);
$result = curl_exec($ch);
if ($result === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
echo $result;
require 'net/http'
uri = URI('https://upload.xbrod.com/v1/upload')
File.open('/path/to/reference.png', 'rb') do |image|
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer <token>'
request.set_form([['files', image]], 'multipart/form-data')
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') { |http| http.request(request) }
puts response.body
end
请求示例
在运行 curl 的机器上指定本地文件路径;@ 表示读取文件内容。多张图片可重复传入 files 字段:
curl -X POST 'https://upload.xbrod.com/v1/upload' \
-H 'Authorization: Bearer <本项目 API 密钥>' \
-F 'files=@/path/to/reference.png'
curl -X POST 'https://upload.xbrod.com/v1/upload' \
-H 'Authorization: Bearer <本项目 API 密钥>' \
-F 'files=@/path/to/first.png' \
-F 'files=@/path/to/second.jpg'
status 和 files 数组。请从对应文件的 url 读取地址,并检查其 status;批量上传时不要仅凭顶层状态判断每个文件是否成功。文件上传不支持传 image_url,若手头只有公网图片地址,请使用图片地址上传。