Chapter 9. Uploads and Downloads

Transferring files to and from the user is a common feature of apps. You can use it to upload data for analysis or download the results as a dataset or as a report. This chapter shows the UI and server components that you’ll need to transfer files in and out of your app. We begin by loading shiny:



We’ll start by discussing file uploads, showing you the basic UI and server components, and then showing how they fit together in a simple app.


The UI needed to support file uploads is simple: just add fileInput() to your UI:

ui <- fluidPage(
  fileInput("upload", "Upload a file")

Like most other UI components, there are only two required arguments: id and label. The width, buttonLabel, and placeholder arguments allow you to tweak the appearance in other ways. I won’t discuss them here, but you can read more about them in ?fileInput.


Handling fileInput() on the server is a little more complicated than other inputs. Most inputs return simple vectors, but fileInput() returns a data frame with four columns:


The original filename on the user’s computer.


The file size, in bytes. By default, the user can only upload files up to 5 MB. You can increase this limit by setting the shiny.maxRequestSize option prior to starting Shiny—to allow up to 10 MB run options(shiny.maxRequestSize = 10 * 1024^2), for example.


The “MIME type” of the file.1 This is a formal specification of the file type that is usually ...

Get Mastering Shiny now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.