Podemos subir un fichero (Hasta un máximo de 2Mb) desde nuestro Client WebPart en SharePoint Framework a través de JSOM. Para ello debemos añadir un fichero, procesarlo e incluirlo en la librería, siguiendo estos pasos:
Debemos obtener el fichero que queremos subir, ya sea mediante alguna librería de terceros (como dropzone.js) o con un simple input de tipo fichero:
<input type="file" id="uploadFile" />
Podemos obtenerlo así:
var files = (document.getElementById('uploadFile') as HTMLInputElement).files;
var file = files[0];
if (file!=undefined || file!=null){
//Here we have the file
}
Una vez tenemos el fichero, debemos crear un objeto de tipo «FileCreationInformation» que contendra toda la información para subirla a la librería.
let fci = new SP.FileCreationInformation(); fci.set_url(file.name); fci.set_overwrite(true);
Para poder procesar el contenido del fichero debemos convertirlo a un array de bytes en base64.
let fr = new FileReader();
fr.onload=function() {
letarrayBuffer= (this.resultasArrayBuffer);
let binary='';
let bytes=newUint8Array(arrayBuffer);
for(let i=0; i<bytes.byteLength; i++) {
binary+=String.fromCharCode(bytes[i]);
}
let content=newSP.Base64EncodedByteArray(btoa(binary));
fci.set_content(content);
//Here we have the FileCreationInformation ready to be uploaded
}
fr.readAsArrayBuffer(file);
Una vez tenemos todos los datos necesarios, tan solo debemos acceder a la librería y añadir el nuevo fichero.
let docs: SP.List = ctx.get_web().get_lists().getByTitle(listTitle);
let fileToUpload = docs.get_rootFolder().get_files().add(fci);
ctx.load(fileToUpload);
ctx.executeQueryAsync((sender, args) => {
resolve();
}, (sender, args) => {
reject(args);
});
Tras subir el fichero podemos retornar la URL del mismo.
resolve(fileToUpload.get_serverRelativeUrl());
La función completa sería:
public static uploadFile(file: File, listTitle: string) : Promise {
return new Promise((resolve, reject) => {
let ctx = SP.ClientContext.get_current();
let fci = new SP.FileCreationInformation();
fci.set_url(file.name);
fci.set_overwrite(true);
let fr = new FileReader();
fr.onload = function() {
let arrayBuffer = (this.result as ArrayBuffer);
let binary = '';
let bytes = new Uint8Array(arrayBuffer);
for(let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
let content = new SP.Base64EncodedByteArray(btoa(binary));
fci.set_content(content);
let docs: SP.List = ctx.get_web().get_lists().getByTitle(listTitle);
let fileToUpload = docs.get_rootFolder().get_files().add(fci);
ctx.load(fileToUpload);
ctx.executeQueryAsync((sender, args) => {
resolve(fileToUpload.get_serverRelativeUrl());
}, (sender, args) => {
reject(args);
});
}
fr.readAsArrayBuffer(file);
});
}
Esta función os permitirá subir ficheros al Root Folder de la librería, si queréis subirlos dentro de una carpeta (o una estructura de carpetas) podéis verlo en el siguiente post: Subir Fichero a una Carpeta en SharePoint Online desde SPFx (React + Typescript)
Nota: Para poder utilizar JSOM en nuestra solucion SPFx debemos incluir las librerias como externas. Paso a paso en la documentación de Microsoft: https://docs.microsoft.com/en-us/sharepoint/dev/spfx/web-parts/guidance/connect-to-sharepoint-using-jsom