@boewa-software/react-async-uploader
Version:
React Uploder
283 lines (170 loc) • 8.38 kB
Markdown
React Async Uploader
====================
Dieses Packet stellt verschiedene React-Komponenten zur Umsetzung eines Asynchronen Clientseitigen Datei-Uplodas bereits. Intern wird hierfür die [resumable.js]-Komponente genutzt.
Hierfür wird eine Serverseitige API genutzt, die beispielsweise vom [BoewaAsyncUploadBundle] implementiert wird.
## Instalation
```bash
$ npm install --save @boewa-software/react-async-uploader
```
## Nutzung
Zur Nutzung, muss ein serverseitiger Endpunkt in form einer URL zum Verschicken der Dateien vorhanden sein.
### Alleinstehender Uploader
Um einen grundlegenden Uploader zu erzeugen, wird lediglich der Pfad zum Endpunkt benötigt (im Folgenden über `/endpoint-url` beschrieben).
Die Uploader-Kompnente kann beispielsweise eine DOM-Node ersetzten (hier exemplarisch über `targetElement`) beschrieben:
````jsx harmony
import React from 'react';
import {createRoot} from "react-dom/client";
import {Uploader} from '@boewa-software/react-async-uploader';
// DOM-Node zum Einhängen der React-Komponente
const targetElement = document.getElementById("target-element");
const root = createRoot(targetElement);
root.render(
<Uploader path={'/endpoint-url'} />
);
````
#### Darstellung überschreiben
Die Darstellung des Uploaders kann nach belibeben überschrieben werden, dafür muss eine React-Komponente implementiert werden, die das Layout definiert.
Die Layout-Komponente wird über das `component`-Property an den Uploader übergeben:
```jsx harmony
import React from 'react';
import {createRoot} from "react-dom/client";
import {Uploader, DropZone, BrowseButton} from '@boewa-software/react-async-uploader';
const CustomLayoutComponent = ({ uploads, assignDrop, assignBrowse }) =>
<DropZone assignDrop={assignDrop}>
Uploads: {uploads.length}
<BrowseButton assignBrowse={assignBrowse}>
Select File
</BrowseButton>
</DropZone>
;
const targetElement = document.getElementById("target-element");
const root = createRoot(targetElement);
root.render(
<Uploader
path={'/endpoint-url'}
component={CustomLayoutComponent}
/>
);
````
Dabei können die Bereitstellten Komponenten zur Definition einer Drop-Zone (`DropZone`) und eines Browse-Buttons (`BrowseButton`) genutzt werden.
##### Übergebene Parameter
Die Layout-Komponente erhält vom Uploader die folgenden Parameter (props) zur Nutzung übergeben:
* uploaderState : `string`
Aktueller Status des Uploaders mit den WerteN:
* `running`: Es werden Dateien hochgeladen.
* `paused`: Uploader ist Pausiert, Dateien werden erst nach dem Aufruf von `start` weiter hochgeladen.
* `complete`: Der Uploader ist aktiv, es sind keine Dateien zum Upload in der Warteschlange.
* uploads : `uploadObject[]`
Array aller aktuellen Uploads. Jedes dieser Opload-Objekte hat die folgenden Properties:
* uniqueIdentifier : `string`
Eindeutiger Identifier zur Zuordnung der Datei (erzeugt aus dem Dateinamen).
* name : `string`
Dateiname des Uploads
* size : `integer`
Dateigröße in Bytes.
* progress : `float`
Upload-Fortschritt.
* uploading : `bool`
Status, ob die Datei aktuell hochgeladen wird.
* complete : `bool`
Status, ob die Datei vollständig hochgeladen wurde.
* error : `?mixed`
Im Fehlerfall der vom Server zurückgemeldete Fehler.
* responseContent : `?object`
Vom Server zurückgemeldete Antwort im Erfolgsfall.
* abort : `func`
Funktion zum Abbrechen des Uplodas der Datei. Die Datei kann über `retry` erneut hochgleaden werden.
* cancel : `func`
Funktion zum Abbrechen des Uplodas der Datei. Die Datei wird aus der Warteschlange entfernt.
* retry : `func`
Im Fehlerfall oder beim Abbruch kann der Upload wiederholt werden.
* addFile : `func(HTML5File file)`
Mauelles Hinzufügen eines [HTML5File-Objekts](https://developer.mozilla.org/de/docs/Web/API/File).
* assignDrop : `func(DOMNode node)`
Registriert die DOMNode `node` als Drop-Zone.
* assignBrowse : `func(DOMNode node)`
Registriert die DOMNode `node` als Browse-Button.
* start : `func`
Aktiviert den Uploader.
* pause : `func`
Pausiert den Uploader.
* reset : `func`
Setzt den Uploader zurück.
Zusätzliche `props` für die Layout-Komponente können von außen über die `componentProps`-Option übergeben werden.
#### Uploder-Optionen
Der Uploader unterstüzt die folgenden Optionen (props):
* path : `string`
URL zum Endpunkt des Servers, der die API implementiert.
* component : `func|React.Component` (optional)
Layout-Komponente zur Darstellung.
* componentProps : `object` (optional)
Zusätzliche `props` für die Layout-Komponente.
* autoStart : `boolean` (optional, default: `true`)
Deaktiviert den automatischen Start des Uploads nach dem Hinzufügen einer Datei.
* clearFileOnSuccess : `boolean` (optional, default: `false`)
Aktiviert, dass Dateien nach erfolgreichem Upload aus der Warteschlange entfernt werden.
* onUploaderComplete : `func` (optional)
Callback, wenn alle Dateien hochgeladen wurden.
* onUploaderProgress : `func` (optional)
Callback, wenn sich der Fortschritt ändert.
* onUploaderPause : `func` (optional)
Callback, wenn der Uploader pausiert wird.
* onUploaderCancel : `func` (optional)
Callback, wenn der Uploader zurückgesetzt wird.
* onFileAdded : `func(upload)` (optional)
Callback, wenn eine Datei zur Warteschlange hinzgefügt wird
* onFileProgress : `func(upload)` (optional)
Callback, wenn sich der Upload-Fortschirtt einer Datei ändert.
* onFileSuccess : `func(upload)` (optional)
Callback, wenn eine Datei erfolgreich hochgeladen wurde
* onFileError : `func(upload)` (optional)
Callback, wenn der Upload einer Datei fehlgeschlagen ist.
* simultaneousUploads : `number` (optional, default: `1`)
Limit für den gleichzeitigen Upload mehrerer Dateien.
* testChunks : `boolean` (optional, default: `true`)
Deaktiviert die Prüfung, ob ein Chunk bereits hochgeladen ist. Verringert die anzahl an Requests, bei großen ggfs. abgebrochenen Uploads wird jedoch dann die gesamte Datei erneut hochgeladen.
### Uploader als Formular-Feld
Über die Komponenten `UploadInput` und `MultipleUploadsInput` können Formuar-Felder erzeugt werden, die einen erfolgten Upload an den Server vermelden.
Diese können mit den `AsyncUploadType` bzw. `MultipleAsyncUploadsType`-FormularTypen aus dem [BoewaAsyncUploadBundle] verknüpft weden.
Analog zum Uploader kann das Layout dieser Komponenten über das `component`-Property (ggfs. im Zusammenspiel mit `componentProps`) überschrieben werden:
```jsx harmony
import React from 'react';
import {createRoot} from "react-dom/client";
import {UploadInput} from '@boewa-software/react-async-uploader';
const InputComponent = ({ value }) => (
<>
{value
? `File: ${value}`
: 'Upload File'
}
<input type={'hidden'} name={'upload_field'} value={value ? value.identifier : ''} />
</>
);
const targetElement = document.getElementById("target-element");
const root = createRoot(targetElement);
root.render(
<UploadInput
path={'/endpoint-url'}
component={InputComponent}
/>
);
```
Das Property `initialValue` empfängt den Initialwert mit den folgenden Pflicht-Attributen:
* identifier : `string`
Unique Identifier der Datei
* name : `string`
Dateiname
* progress : `number`
Fortschritt des Uploads
* completed : `boolean`
Attribut, ob der Upload erfolgreich war.
Die `MultipleUploadsInput`-Komponente emfängt für `initialValue` ein Array von Objekten dieses Typs.
### Weitere-Komponenten
#### `DropZone`
Diese Komponente ermöglicht die Erzeugung einer Drop-Zone für Uploads. Dafür muss der `assignDrop`-Callback des Uploaders an die Komponente übergeben werden.
#### `BrowseButton`
Diese Komponente ermöglicht die Erzeugung eines Browse-Buttons für Uploads. Dafür muss der `assignBrowse`-Callback des Uploaders an die Komponente übergeben werden.
### Weiterentwicklung und DEMO
Infos hierzu sind in der [Entwicklungs-Dokumentation](./docs/Development.md) zu finden.
[resumable.js]: https://github.com/23/resumable.js
[BoewaAsyncUploadBundle]: https://gitlab.boewa-software.de/boewa-software/async-upload-bundle