FileUpload

FileUpload is an advanced uploader with drag and drop support, multi file uploads, auto uploading, progress tracking and validations.


import { FileUploadModule } from 'primeng/fileupload';

FileUpload basic mode provides a simpler UI as an alternative to default advanced mode.

Choose

<p-fileUpload 
    mode="basic" 
    chooseLabel="Choose" 
    chooseIcon="pi pi-upload"
    name="demo[]" 
    url="https://www.primefaces.org/cdn/api/upload.php" 
    accept="image/*" 
    maxFileSize="1000000" 
    (onUpload)="onUpload($event)" />

When auto property is enabled, a file gets uploaded instantly after selection.

Browse

<p-fileUpload 
    mode="basic" 
    name="demo[]" 
    chooseIcon="pi pi-upload" 
    url="https://www.primefaces.org/cdn/api/upload.php" 
    accept="image/*" maxFileSize="1000000" 
    (onUpload)="onBasicUploadAuto($event)" 
    [auto]="true" 
    chooseLabel="Browse" />

Uploader UI is customizable using a ng-template called file that gets the File instance as the implicit variable. Second ng-template named content can be used to place custom content inside the content section which would be useful to implement a user interface to manage the uploaded files such as removing them. This template gets the selected files as the implicit variable. Third and final ng-template option is toolbar to display custom content at toolbar.

Drag and drop files here to upload.


<p-toast />
<p-fileUpload name="myfile[]" url="https://www.primefaces.org/cdn/api/upload.php" [multiple]="true" accept="image/*" maxFileSize="1000000" (onUpload)="onTemplatedUpload()" (onSelect)="onSelectedFiles($event)">
    <ng-template pTemplate="header" let-files let-chooseCallback="chooseCallback" let-clearCallback="clearCallback" let-uploadCallback="uploadCallback">
        <div class="flex flex-wrap justify-content-between align-items-center flex-1 gap-2">
            <div class="flex gap-2">
                <p-button (onClick)="choose($event, chooseCallback)" icon="pi pi-images" [rounded]="true" [outlined]="true" />
                <p-button (onClick)="uploadEvent(uploadCallback)" icon="pi pi-cloud-upload" [rounded]="true" [outlined]="true" severity="success" [disabled]="!files || files.length === 0" />
                <p-button (onClick)="clearCallback()" icon="pi pi-times" [rounded]="true" [outlined]="true" severity="danger" [disabled]="!files || files.length === 0" />
            </div>
            <p-progressBar [value]="totalSizePercent" [showValue]="false" styleClass="md:w-20rem h-1rem w-full md:ml-auto" [ngClass]="{ 'exceeded-progress-bar': totalSizePercent > 100 }">
                <span class="white-space-nowrap">{{ totalSize }}B / 1Mb</span>
            </p-progressBar>
        </div>
    </ng-template>
    <ng-template pTemplate="content" let-files let-uploadedFiles="uploadedFiles" let-removeFileCallback="removeFileCallback" let-removeUploadedFileCallback="removeUploadedFileCallback">
        <div *ngIf="files?.length > 0">
            <h5>Pending</h5>
            <div class="flex flex-wrap p-0 sm:p-5 gap-5">
                <div *ngFor="let file of files; let i = index" class="card m-0 px-6 flex flex-column border-1 surface-border align-items-center gap-3">
                    <div>
                        <img role="presentation" [alt]="file.name" [src]="file.objectURL" width="100" height="50" />
                    </div>
                    <span class="font-semibold">{{ file.name }}</span>
                    <div>{{ formatSize(file.size) }}</div>
                    <p-badge value="Pending" severity="warning" />
                    <p-button icon="pi pi-times" (onClick)="onRemoveTemplatingFile($event, file, removeFileCallback, index)" [outlined]="true" [rounded]="true" severity="danger" />
                </div>
            </div>
        </div>
        <div *ngIf="uploadedFiles?.length > 0">
            <h5>Completed</h5>
            <div class="flex flex-wrap p-0 sm:p-5 gap-5">
                <div *ngFor="let file of uploadedFiles; let i = index" class="card m-0 px-6 flex flex-column border-1 surface-border align-items-center gap-3">
                    <div>
                        <img role="presentation" [alt]="file.name" [src]="file.objectURL" width="100" height="50" />
                    </div>
                    <span class="font-semibold">{{ file.name }}</span>
                    <div>{{ formatSize(file.size) }}</div>
                    <p-badge value="Completed" class="mt-3" severity="success" />
                    <p-button icon="pi pi-times" (onClick)="removeUploadedFileCallback(index)" [outlined]="true" [rounded]="true" severity="danger" />
                </div>
            </div>
        </div>
    </ng-template>
    <ng-template pTemplate="file"> </ng-template>
    <ng-template pTemplate="empty">
        <div class="flex align-items-center justify-content-center flex-column">
            <i class="pi pi-cloud-upload border-2 border-circle p-5 text-8xl text-400 border-400"></i>
            <p class="mt-4 mb-0">Drag and drop files here to upload.</p>
        </div>
    </ng-template>
</p-fileUpload>

FileUpload is an advanced uploader with dragdrop support, multi file uploads, auto uploading, progress tracking and validations.

Choose
Drag and drop files here to upload.

<p-fileUpload 
    name="demo[]" 
    url="https://www.primefaces.org/cdn/api/upload.php" 
    (onUpload)="onUpload($event)" 
    [multiple]="true" 
    accept="image/*" 
    maxFileSize="1000000">
        <ng-template pTemplate="content">
            <ul *ngIf="uploadedFiles.length">
                <li *ngFor="let file of uploadedFiles">
                    {{ file.name }} - {{ file.size }} bytes
                </li>
            </ul>
        </ng-template>
</p-fileUpload>

Following is the list of structural style classes, for theming classes visit theming page.

NameElement
p-fileuploadContainer element
p-fileupload-buttonbarHeader containing the buttons
p-fileupload-contentContent section

Screen Reader

FileUpload uses a hidden native input element with type="file" for screen readers.

Keyboard Support

Interactive elements of the uploader are buttons, visit the Button accessibility section for more information.