Transloadit
The @uppy/transloadit
plugin can be used to upload files directly to
Transloadit for all kinds of processing, such as
transcoding video, resizing images, zipping/unzipping, and much
more.
When should I use it?
Not sure which uploader is best for you? Read “Choosing the uploader you need”.
Transloadit’s strength is versatility. By doing video, audio, images, documents,
and more, you only need one vendor for all your file processing
needs. The @uppy/transloadit
plugin directly uploads to
Transloadit so you only have to worry about creating a
Template. Transloadit accepts the files, processes
according to the instructions in the Template, and stores the results in storage
of your choosing, such as a self-owned S3 bucket. The Transloadit plugin uses
Tus under the hood so you don’t have to sacrifice reliable,
resumable uploads.
You should use @uppy/transloadit
if you don’t want to host your own Tus or
Companion servers, (optionally) need file processing, and store it in the
service (such as S3 or GCS) of your liking. All with minimal effort.
Install
- NPM
- Yarn
- CDN
npm install @uppy/transloadit
yarn add @uppy/transloadit
The bundle consists of most Uppy plugins, so this method is not recommended for production, as your users will have to download all plugins when you are likely using only a few.
It can be useful to speed up your development environment, so don't hesitate to use it to get you started.
<!-- 1. Add CSS to `<head>` -->
<link href="https://releases.transloadit.com/uppy/v4.8.0/uppy.min.css" rel="stylesheet">
<!-- 2. Initialize -->
<div id="uppy"></div>
<script type="module">
import { Uppy, Transloadit } from "https://releases.transloadit.com/uppy/v4.8.0/uppy.min.mjs"
new Uppy().use(Transloadit, { /* see options */ })
</script>
Use
A quick overview of the complete API.
import Uppy from '@uppy/core';
import Dashboard from '@uppy/dashboard';
import Transloadit from '@uppy/transloadit';
import '@uppy/core/dist/style.min.css';
import '@uppy/dashboard/dist/style.min.css';
const uppy = new Uppy()
.use(Dashboard, { inline: true, target: 'body' })
.use(Transloadit, {
assemblyOptions: {
params: {
auth: { key: 'your-transloadit-key' },
template_id: 'your-template-id',
},
},
});
// Optionally listen to events
uppy.on('transloadit:assembly-created', (assembly, fileIDs) => {});
uppy.on('transloadit:upload', (file, assembly) => {});
uppy.on('transloadit:assembly-executing', (assembly) => {});
uppy.on('transloadit:result', (stepName, result, assembly) => {});
uppy.on('transloadit:complete', (assembly) => {});
Use with Companion
All Transloadit plans come with a hosted version of Companion.
You can use this plugin together with Transloadit’s hosted Companion service to let your users import files from third party sources across the web. To do so each provider plugin must be configured with Transloadit’s Companion URLs:
import { COMPANION_URL, COMPANION_ALLOWED_HOSTS } from '@uppy/transloadit';
import Dropbox from '@uppy/dropbox';
uppy.use(Dropbox, {
companionUrl: COMPANION_URL,
companionAllowedHosts: COMPANION_ALLOWED_HOSTS,
});
This will already work. Transloadit’s OAuth applications are used to authenticate your users by default. Your users will be asked to provide Transloadit access to their files. Since your users are probably not aware of Transloadit, this may be confusing or decrease trust. You may also hit rate limits, because the OAuth application is shared between everyone using Transloadit.
To solve that, you can use your own OAuth keys with Transloadit’s hosted Companion servers by using Transloadit Template Credentials. Create a Template Credential on the Transloadit site. Select “Companion OAuth” for the service, and enter the key and secret for the provider you want to use. Then you can pass the name of the new credentials to that provider:
import { COMPANION_URL, COMPANION_ALLOWED_HOSTS } from '@uppy/transloadit';
import Dropbox from '@uppy/dropbox';
uppy.use(Dropbox, {
companionUrl: COMPANION_URL,
companionAllowedHosts: COMPANION_ALLOWED_HOSTS,
companionKeysParams: {
key: 'YOUR_TRANSLOADIT_API_KEY',
credentialsName: 'my_companion_dropbox_creds',
},
});
API
Options
id
A unique identifier for this plugin (string
, default: 'Transloadit'
).
service
The Transloadit API URL to use (string
, default:
https://api2.transloadit.com
).
The default will try to route traffic efficiently based on the location of your
users. You could for instance set it to https://api2-us-east-1.transloadit.com
if you need the traffic to stay inside a particular region.
limit
Limit the amount of uploads going on at the same time (number
, default: 20
).
Setting this to 0
means no limit on concurrent uploads, but we recommend a
value between 5
and 20
. This option is passed through to the
@uppy/tus
plugin, which this plugin uses internally.
assemblyOptions
Configure the
Assembly Instructions,
the fields to send along to the assembly, and authentication
(object | function
, default: null
).
The object you can pass or return from a function has this structure:
{
params: {
auth: { key: 'key-from-transloadit' },
template_id: 'id-from-transloadit',
steps: {
// Overruling Template at runtime
},
notify_url: 'https://your-domain.com/assembly-status',
},
signature: 'generated-signature',
fields: {
// Dynamic or static fields to send along
},
}
params
is used to authenticate with Transloadit and using your desired template.auth.key
(required) is your authentication key which you can find on the “Credentials” page of your account.template_id
(required) is the unique identifier to use the right template from your account.steps
(optional) can be used to overrule Templates at runtime. A typical use case might be changing the storage path on the fly based on the session user id. For most use cases, we recommend to let your Templates handle dynamic cases (they can acceptfields
and execute arbitrary JavaScript as well), and not pass insteps
from a browser. The template editor also has extra validations and context.notify_url
(optional) is a pingback with the assembly status as JSON. For instance, if you don’t want to block the user experience by letting them wait for your template to complete withwaitForEncoding
, but you do want to want to asynchrounously have an update, you can provide an URL which will be “pinged” with the assembly status.
signature
(optional, but recommended) is a cryptographic signature to provide further trust in unstrusted environments. Refer to “Signature Authentication” for more information.fields
(optional) can be used to to send along key/value pairs, which can be used dynamically in your template.
All your files end up in a single assembly and your fields
are available
globally in your template. The metadata in your Uppy files is also sent along so
you can do things dynamically per file with file.user_meta
in your template.
Examples
As a function
Most likely you want to use a function to call your backend to generate a signature and return your configuration.
uppy.use(Transloadit, {
async assemblyOptions() {
const res = await fetch('/transloadit-params');
return res.json();
},
});
As an object
If you don’t need to change anything dynamically, you can also pass an object directly.
uppy.use(Transloadit, {
assemblyOptions: {
params: { auth: { key: 'transloadit-key' } },
},
});
Use with @uppy/form
Combine the assemblyOptions()
option with the Form plugin to
pass user input from a <form>
to a Transloadit Assembly:
// This will add form field values to each file's `.meta` object:
uppy.use(Form, { getMetaFromForm: true });
uppy.use(Transloadit, {
async assemblyOptions() {
const res = await fetch('/transloadit-params');
return res.json();
};
});
When you go to production always make sure to set the signature
. Not using
Signature Authentication
can be a security risk. Signature Authentication is a security measure that
can prevent outsiders from tampering with your Assembly Instructions. While
Signature Authentication is not implemented (yet), we recommend to disable
allow_steps_override
in your Templates to avoid outsiders being able to pass
in any Instructions and storage targets on your behalf.
waitForEncoding
Wait for the template to finish, rather than only the upload, before marking the
upload complete (boolean
, default: false
).
- When
false
, the Assemblies will complete (or error) in the background but Uppy won’t know or care about it. You may have to let Transloadit ping you via anotify_url
and asynchronously inform your user (email, in-app notification). - When
true
, the Transloadit plugin waits for Assemblies to complete before the files are marked as completed. This means users have to wait for a potentially long time, depending on how complicated your Assembly instructions are. But, you can receive the final status and transcoding results on the client side with less effort.
When this is enabled, you can listen for the
transloadit:result
and
transloadit:complete
events.
waitForMetadata
Wait for Transloadit’s backend to catch early errors, not the entire Assembly to
complete. (boolean
, default: false
)
When set to true
, the Transloadit plugin waits for Transloadit’s backend to
extract metadata from all the uploaded files. This is mostly handy if you want
to have a quick user experience (so your users don’t necessarily need to wait
for all the encoding to complete), but you do want to let users know about some
types of errors that can be caught early on, like file format issues.
You you can listen for the transloadit:upload
event when
this or waitForEncoding
is enabled.
importFromUploadURLs
Allow another plugin to upload files, and then import those files into the
Transloadit Assembly (boolean
, default: false
).
When enabling this option, Transloadit will not configure the Tus plugin to upload to Transloadit. Instead, a separate upload plugin must be used. Once the upload completes, the Transloadit plugin adds the uploaded file to the Assembly.
For example, to upload files to an S3 bucket and then transcode them:
uppy.use(AwsS3, {
getUploadParameters(file) {
return {
/* upload parameters */
};
},
});
uppy.use(Transloadit, {
importFromUploadURLs: true,
assemblyOptions: {
params: {
auth: { key: 'YOUR_API_KEY' },
template_id: 'YOUR_TEMPLATE_ID',
},
},
});
Tranloadit will download the files and expose them to your Template as
:original
, as if they were directly uploaded from the Uppy client.
For this to work, the upload plugin must assign a publicly accessible
uploadURL
property to the uploaded file object. The Tus and S3 plugins both do
this automatically, but you must configure your S3 bucket to have publicly
readable objects. For the XHRUpload plugin, you may have to specify a custom
getResponseData
function.
alwaysRunAssembly
Always create and run an Assembly when uppy.upload()
is called, even if no
files were selected (boolean
, default: false
).
This allows running Assemblies that do not receive files, but instead use a
robot like /s3/import
to download the files from elsewhere, for example, for a bulk transcoding job.
locale
export default {
strings: {
// Shown while Assemblies are being created for an upload.
creatingAssembly: 'Preparing upload...',
// Shown if an Assembly could not be created.
creatingAssemblyFailed: 'Transloadit: Could not create Assembly',
// Shown after uploads have succeeded, but when the Assembly is still executing.
// This only shows if `waitForMetadata` or `waitForEncoding` was enabled.
encoding: 'Encoding...',
},
};
clientName
Append a custom client name to the Transloadit-Client
header field when
creating an Assembly (string
, default: null
).
The Transloadit-Client
header includes by default information about the used
SDK and is included in the Assembly Status under the transloadit_client
property. By providing a value, such as homepage-file-uploader
, you can
identify the client and SDK that created a given Assembly.
Deprecated options
These options have been deprecated in favor of
assemblyOptions
, which we now recommend for all use cases.
You can still use these options, but they will be removed in the next major
version.
getAssemblyOptions
This function behaves the same as passing a function to
assemblyOptions
.
params
The Assembly parameters to use for the upload (object
, default: null
) See
the Transloadit documentation on
Assembly Instructions
for further information.
The auth.key
Assembly parameter is required. You can also use the steps
or
template_id
options here as described in the Transloadit documentation.
uppy.use(Transloadit, {
params: {
auth: { key: 'YOUR_TRANSLOADIT_KEY' },
steps: {
encode: {
robot: '/video/encode',
use: {
steps: [':original'],
fields: ['file_input_field2'],
},
preset: 'iphone',
},
},
},
});
signature
An optional signature for the Assembly parameters. See the Transloadit documentation on Signature Authentication for further information.
If a signature
is provided, params
should be a JSON string instead of a
JavaScript object, as otherwise the generated JSON in the browser may be
different from the JSON string that was used to generate the signature.
fields
An object of form fields to send along to the Assembly. Keys are field names, and values are field values. See also the Transloadit documentation on Form Fields In Instructions.
uppy.use(Transloadit, {
// ...
fields: {
message: 'This is a form field',
},
});
You can also pass an array of field names to send global or file metadata along
to the Assembly. Global metadata is set using the
meta
option in the Uppy constructor, or using the
setMeta
method. File metadata is set using
the setFileMeta
method. The
Form plugin also sets global metadata based on the values of
<input />
s in the form, providing a handy way to use values from HTML form
fields:
uppy.use(Form, { target: 'form#upload-form', getMetaFromForm: true });
uppy.use(Transloadit, {
fields: ['field_name', 'other_field_name'],
params: {
/* ... */
},
});
Form fields can also be computed dynamically using custom logic, by using the
getAssemblyOptions(file)
option.
Static exports
COMPANION_URL
The main endpoint for Transloadit’s hosted companions. You can use this constant in remote provider options, like so:
import Dropbox from '@uppy/dropbox';
import { COMPANION_URL } from '@uppy/transloadit';
uppy.use(Dropbox, {
companionUrl: COMPANION_URL,
});
When using COMPANION_URL
, you should also configure
companionAllowedHosts
.
The value of this constant is https://api2.transloadit.com/companion
. If you
are using a custom service
option, you should also set a custom
host option in your provider plugins, by taking a Transloadit API url and
appending /companion
:
uppy.use(Dropbox, {
companionUrl: 'https://api2-us-east-1.transloadit.com/companion',
});
COMPANION_ALLOWED_HOSTS
A RegExp pattern matching Transloadit’s hosted companion endpoints. The pattern
is used in remote provider companionAllowedHosts
options, to make sure that
third party authentication messages cannot be faked by an attacker’s page but
can only originate from Transloadit’s servers.
Use it whenever you use companionUrl: COMPANION_URL
, like so:
import Dropbox from '@uppy/dropbox';
import { COMPANION_ALLOWED_HOSTS } from '@uppy/transloadit';
uppy.use(Dropbox, {
companionAllowedHosts: COMPANION_ALLOWED_HOSTS,
});
The value of this constant covers all Transloadit’s Companion servers, so it
does not need to be changed if you are using a custom service
option. But, if you are not using the Transloadit Companion servers at
*.transloadit.com
, make sure to set the companionAllowedHosts
option to
something that matches what you do use.
Events
transloadit:assembly-created
Fired when an Assembly is created.
Parameters
assembly
- The initial Assembly Status.fileIDs
- The IDs of the files that will be uploaded to this Assembly.
uppy.on('transloadit:assembly-created', (assembly, fileIDs) => {
console.group('Created', assembly.assembly_id, 'for files:');
for (const id of fileIDs) {
console.log(uppy.getFile(id).name);
}
console.groupEnd();
});
transloadit:upload
Fired when Transloadit has received an upload. Requires
waitForMetadata
to be set.
Parameters
file
- The Transloadit file object that was uploaded.assembly
- The Assembly Status of the Assembly to which the file was uploaded.
transloadit:assembly-executing
Fired when Transloadit has received all uploads, and is executing the Assembly.
Parameters
assembly
- The Assembly Status of the Assembly that is executing.
transloadit:result
Fired when a result came in from an Assembly. Requires
waitForEncoding
to be set.
Parameters
stepName
- The name of the Assembly step that generated this result.result
- The result object from Transloadit. This result object has one more property, namelylocalId
. This is the ID of the file in Uppy’s local state, and can be used withuppy.getFile(id)
.assembly
- The Assembly Status of the Assembly that generated this result.
uppy.on('transloadit:result', (stepName, result) => {
const file = uppy.getFile(result.localId);
document.body.appendChild(html`
<div>
<h2>From ${file.name}</h2>
<a href=${result.ssl_url}> View </a>
</div>
`);
});
transloadit:complete
Fired when an Assembly completed. Requires waitForEncoding
to be set.
Parameters
assembly
- The final Assembly Status of the completed Assembly.
uppy.on('transloadit:complete', (assembly) => {
// Could do something fun with this!
console.log(assembly.results);
});
Frequently Asked Questions
Accessing the assembly when an error occurred
If an error occurs when an Assembly has already started, you can find the
Assembly Status on the error object’s assembly
property.
uppy.on('error', (error) => {
if (error.assembly) {
console.log(`Assembly ID ${error.assembly.assembly_id} failed!`);
console.log(error.assembly);
}
});
Assembly behavior when Uppy is closed
When integrating @uppy/transloadit
with @uppy/dashboard
, closing the
dashboard will result in continuing assemblies on the server. When the user
manually cancels the upload any running assemblies will be cancelled.