Import et sauvegarde d'un fichier via un Custom Widget Builder

Bonjour,

Je cherche via un Custom Widget Builder à importer un fichier et le sauvegarder dans une table.
Pour cela je passe par un input de type « file », puis un bouton de sauvegarde se charge d’envoyer le fichier en base.

Or je ne trouve pas de système permettant de sauvegarder ce fichier. J’ai trouvé plusieurs notes avec « grist.docApi.uploadAttachment() », mais visiblement cette méthode n’existe pas encore dans la version actuelle de l’API.

Auriez-vous une solution à ce problème ?

Merci

Hello ! Est-ce-que cet article sur le forum anglophone t’aide ? Accessing attachments from Custom Widget builder - Developers - Grist Creators

@vincent.viers Ce post est plutôt pour le téléchargement de PJ déjà dans une table, tu penses que ça marche pareil pour le chargement, il faut ajouter le token ?

Avec par ex :

    const url = `${baseUrl}/attachments?auth=${token}`;

Sachant que l’appel API d’upload est :
https://{gristhost}/api/docs/{docId}/attachments

J’ai fait quelques tests, et je ne trouve pas comment faire pour contourner les restrictions CORS des custom widgets… @thomas tu as fait comment stp ?

I built a custom widget to upload documents.
It relies on access tokens based requests.
Attach user from access token after checks by guillett · Pull Request #1614 · gristlabs/grist-core · GitHub

Idem. J’ai essayé une solution de bidouillage en ayant pour idée de :

  1. Ajouter le PDF dans la table des attachments
  2. Lié le dernier attachments à mon champ

Ce qui donne ce code :

const file = inputBulletin.files[0];
let attachmentValue = null;
if (file) {
  alert("fichier attaché : " + file.name);
  const timestamp = Date.now();
  const randomString = Math.random().toString(36).substr(2, 9);
  const fileIdent = `${timestamp}${randomString}.${file.name.split('.').pop()}`;
  
  // Créer les métadonnées du fichier
  const fileMetadata = {
    "fileExt": '.' + file.name.split('.').pop(),
    "fileIdent": fileIdent,
    "fileName": file.name,
    "fileSize": file.size,
    "imageHeight": 0,
    "imageWidth": 0,
    "timeUploaded": Date.now()
  };

  await grist.docApi.applyUserActions([
    ["AddRecord", "_grist_Attachments", undefined, fileMetadata]
  ]);

  attachmentValue = await getLatestAttachment();
}

Le fichier s’ajoute bien dans la table Attachments et se lie bien à mon champ, par contre impossible de lire le fichier (ce qui me paraît normal au vu des méta données que j’ai inscris, mais je ne vois pas comment faire mieux)

Je me permets de vous relancer sur le sujet, n’ayant toujours pas trouvé de solution (que ce soit avec _grist_Attachments ou le blocage CORS).