Awesome Open Source
Awesome Open Source

Upload.js

JavaScript File Upload Library
(With Integrated Cloud Storage)



Twitter URL

Get Started Try on CodePen

Upload.js Demo

Files Hosted on Upload.io: The File Upload Service for Developers.

Installation

Install via NPM:

npm install upload-js

Or via NPM:

yarn add upload-js

Or via a <script> tag:

<script src="https://js.upload.io/upload-js/v1"></script>

Usage

Option 1: Use an <input> element Try on CodePen

To create a working file upload button, copy this example:

<html>
  <head>
    <script src="https://js.upload.io/upload-js/v1"></script>
    <script>
      const upload = new Upload({
        // Get production API keys from Upload.io
        apiKey: "free"
      });

      const uploadFile = upload.createFileInputHandler({
        onProgress: ({ bytesSent, bytesTotal }) => {
          console.log(`${bytesSent / bytesTotal}% complete`)
        },
        onUploaded: ({ fileUrl, fileId }) => {
          alert(`File uploaded!\n${fileUrl}`);
        },
        onError: (error) => {
          alert(`Error!\n${error.message}`);
        }
      });
    </script>
  </head>
  <body>
    <input type="file" onchange="uploadFile(event)" />
  </body>
</html>

Option 2: Use a File object Try on CodePen

If you have a File object already, use the upload.uploadFile(...) method:

const { Upload } = require("upload-js");
const upload = new Upload({ apiKey: "free" });

const onFileInputChange = async event => {
  const fileObject = event.target.files[0];

  const { fileUrl, fileId } = await upload.uploadFile({
    file: fileObject,
    onProgress: ({ bytesSent, bytesTotal }) => {
      console.log(`${bytesSent / bytesTotal}% complete`)
    }
  });

  alert(`File uploaded to: ${fileUrl}`);
}

Option 3: Use our UI widget Try on CodePen

Uploader is our file & image upload widget, powered by Upload.js.

Uploader has a larger payload size (29kB) compared to Upload.js (7kB), but if you're writing a file upload UI component, it could save you time: Uploader provides things like progress bars and cancellation out-the-box.

Use with Popular Frameworks

Upload Files with React Try on CodePen

const { Upload } = require("upload-js");
const upload = new Upload({ apiKey: "free" });

const MyUploadButton = () => {
  const uploadFile = upload.createFileInputHandler({
    onProgress: ({ bytesSent, bytesTotal }) => {
      console.log(`${bytesSent / bytesTotal}% complete`)
    },
    onUploaded: ({ fileUrl, fileId }) => {
      alert(`File uploaded!\n${fileUrl}`);
    },
    onError: (error) => {
      alert(`Error!\n${error.message}`);
    }
  });

  return <input type="file" onChange={uploadFile} />;
};

Upload Files with Angular Try on CodePen

const { Upload } = require("upload-js");
const upload = new Upload({ apiKey: "free" });
angular
  .module("exampleApp", [])
  .controller("exampleController", $scope => {
    $scope.uploadFile = upload.createFileInputHandler({
      onProgress: ({ bytesSent, bytesTotal }) => {
        console.log(`${bytesSent / bytesTotal}% complete`)
      },
      onUploaded: ({ fileUrl, fileId }) => {
        alert(`File uploaded!\n${fileUrl}`);
      },
      onError: (error) => {
        alert(`Error!\n${error.message}`);
      }
    });
  })
  .directive("onChange", () => ({
    link: (scope, element, attrs) => {
      element.on("change", scope.$eval(attrs.onChange));
    }
  }));

Upload Files with Vue.js Try on CodePen

const { Upload } = require("upload-js");
const upload = new Upload({ apiKey: "free" });
const uploadFile = upload.createFileInputHandler({
  onProgress: ({ bytesSent, bytesTotal }) => {
    console.log(`${bytesSent / bytesTotal}% complete`)
  },
  onUploaded: ({ fileUrl, fileId }) => {
    alert(`File uploaded!\n${fileUrl}`);
  },
  onError: (error) => {
    alert(`Error!\n${error.message}`);
  }
});
const vueApp = new Vue({
  el: "#example",
  methods: { uploadFile }
});

Upload Files with jQuery Try on CodePen

<html>
  <head>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://js.upload.io/upload-js/v1"></script>
    <script>
      const upload = new Upload({
        // Get production API keys from Upload.io
        apiKey: "free"
      });

      $(() => {
        $("#file-input").change(
          upload.createFileInputHandler({
            onBegin: () => {
              $("#file-input").hide()
            },
            onProgress: ({ bytesSent, bytesTotal }) => {
              const progress = Math.round(bytesSent / bytesTotal * 100)
              $("#title").html(`File uploading... ${progress}%`)
            },
            onError: (error) => {
              $("#title").html(`Error:<br/><br/>${error.message}`)
            },
            onUploaded: ({ fileUrl, fileId }) => {
              $("#title").html(`
                File uploaded:
                <br/>
                <br/>
                <a href="${fileUrl}" target="_blank">${fileUrl}</a>`
              )
            }
          })
        )
      })
    </script>
  </head>
  <body>
    <h1 id="title">Please select a file...</h1>
    <input type="file" id="file-input" />
  </body>
</html>

Upload Multiple Files with jQuery Try on CodePen

Please refer to the CodePen example (link above).

Overview of the code:

  1. Instantiate Upload once in your app (at the start).
  2. Call createFileInputHandler once for each file <input> element.
  3. Use onProgress to display the upload progress for each input element.
  4. When onUploaded fires, record the fileUrl from the callback's argument to a local variable.
  5. When onUploaded has fired for all files, the form is ready to be submitted.

Note: file uploads will safely run in parallel, despite using the same Upload instance.

Force File Downloads

By default, the browser will attempt to render uploaded files:

https://upcdn.io/W142hJkHhVSQ5ZQ5bfqvanQ

To force a file to download, add ?download=true to the file's URL:

https://upcdn.io/W142hJkHhVSQ5ZQ5bfqvanQ?download=true

Resize Images

Given an uploaded image URL:

https://upcdn.io/W142hJkHhVSQ5ZQ5bfqvanQ

Resize with:

https://upcdn.io/W142hJkHhVSQ5ZQ5bfqvanQ/thumbnail

Auto-crop with:

https://upcdn.io/W142hJkHhVSQ5ZQ5bfqvanQ/thumbnail-square

Tip: to create more transformations, please register an account.

Crop Images Try on CodePen

To crop images using manually-provided geometry:

<html>
  <head>
    <script src="https://js.upload.io/upload-js/v1"></script>
    <script>
      const upload = new Upload({
        // Get production API keys from Upload.io
        apiKey: "free"
      });

      // Step 1: Upload the original file.
      const onOriginalImageUploaded = ({ fileId, fileUrl: originalImageUrl }) => {

        // Step 2: Configure crop geometry.
        const crop = {
          // Type Def: https://github.com/upload-io/upload-image-plugin/blob/main/src/types/ParamsFromFile.ts
          input: fileId,
          pipeline: {
            steps: [
              {
                geometry: {
                  // Prompt your user for these dimensions...
                  offset: {
                    x: 20,
                    y: 40
                  },
                  size: {
                    // ...and these too...
                    width: 200,
                    height: 100,
                    type: "widthxheight!"
                  }
                },
                type: "crop"
              }
            ]
          }
        }

        // Step 3: Upload the crop geometry.
        const blob = new Blob([JSON.stringify(crop)], {type: "application/json"});
        upload
          .uploadFile({
            file: {
              name: `${fileId}_cropped.json`, // Can be anything.
              type: blob.type,
              size: blob.size,
              slice: (start, end) => blob.slice(start, end)
            }
          })
          .then(
            ({ fileUrl: cropGeometryUrl }) => {

              // Step 4: Done! Here's the cropped image's URL:
              alert(`Cropped image:\n${cropGeometryUrl}/thumbnail`)

            },
            e => console.error(e)
          );
      };

      const uploadFile = upload.createFileInputHandler({
        onUploaded: onOriginalImageUploaded
      });
    </script>
  </head>
  <body>
    <input type="file" onchange="uploadFile(event)" />
  </body>
</html>

Documentation

See Upload.js Documentation

Features

Upload.js is the JavaScript client library for Upload.io: the file upload service for developers.

Core features:

  • File Storage. (Files stored for 4 hours with the "free" API key.)
  • File Hosting via CDN. (Files served from 100 locations worldwide.)
  • Fast Image Transformations. (Resize images, crop images & convert images.)

Available with an account:

  • Permanent Storage. (The "free" API key provides temporary storage only.)
  • Unlimited Daily Uploads. (The "free" API key allows 100 uploads per day per IP.)
  • Extended CDN Coverage. (Files served from 300+ locations worldwide.)
  • More File Transformations. (Custom image resizing, cropping, converting, etc.)
  • Upload & Download Authentication. (Supports federated auth via your own JWT authorizer.)
  • File & Folder Management.
  • Expiring Links.
  • Custom CNAME.
  • Advanced Upload Control:
    • Rate Limiting.
    • Traffic Limiting.
    • File Size Limiting.
    • IP Blacklisting.
    • File Type Blacklisting.
    • And More...

Create an Upload.io account

Building From Source

Please read: BUILD.md

Contribute

If you would like to contribute to Upload.js:

  1. Add a GitHub Star to the project (if you're feeling generous!).
  2. Determine whether you're raising a bug, feature request or question.
  3. Raise your issue or PR.

License

MIT



Alternative Project Comparisons
Related Awesome Lists
Top Programming Languages
Top Projects

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Javascript (1,047,647
Typescript (239,115
Upload (14,330
File Upload (1,055
Image Uploader (172
Image Upload (100
File Uploader (56
Upload Library (3