my_gradio / client /js /src /utils /upload_files.ts
xray918's picture
Upload folder using huggingface_hub
0ad74ed verified
import type { Client } from "..";
import { BROKEN_CONNECTION_MSG, UPLOAD_URL } from "../constants";
import type { UploadResponse } from "../types";
export async function upload_files(
this: Client,
root_url: string,
files: (Blob | File)[],
upload_id?: string
): Promise<UploadResponse> {
const headers: {
Authorization?: string;
} = {};
if (this?.options?.hf_token) {
headers.Authorization = `Bearer ${this.options.hf_token}`;
}
const chunkSize = 1000;
const uploadResponses = [];
let response: Response;
for (let i = 0; i < files.length; i += chunkSize) {
const chunk = files.slice(i, i + chunkSize);
const formData = new FormData();
chunk.forEach((file) => {
formData.append("files", file);
});
try {
const upload_url = upload_id
? `${root_url}${this.api_prefix}/${UPLOAD_URL}?upload_id=${upload_id}`
: `${root_url}${this.api_prefix}/${UPLOAD_URL}`;
response = await this.fetch(upload_url, {
method: "POST",
body: formData,
headers,
credentials: "include"
});
} catch (e) {
throw new Error(BROKEN_CONNECTION_MSG + (e as Error).message);
}
if (!response.ok) {
const error_text = await response.text();
return { error: `HTTP ${response.status}: ${error_text}` };
}
const output: UploadResponse["files"] = await response.json();
if (output) {
uploadResponses.push(...output);
}
}
return { files: uploadResponses };
}