uppy

Companion Uppy always fails with > 5GB uploads when getting the /complete request


companion: 2022-09-22T23:31:07.088Z [error] a62da431-f9ce-4fae-b18d-dc59189a53ea root.error PayloadTooLargeError: request entity too large
    at readStream (/usr/local/share/.config/yarn/global/node_modules/raw-body/index.js:155:17)
    at getRawBody (/usr/local/share/.config/yarn/global/node_modules/raw-body/index.js:108:12)
    at read (/usr/local/share/.config/yarn/global/node_modules/body-parser/lib/read.js:77:3)
    at jsonParser (/usr/local/share/.config/yarn/global/node_modules/body-parser/lib/types/json.js:135:5)
    at Layer.handle [as handle_request] (/usr/local/share/.config/yarn/global/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/local/share/.config/yarn/global/node_modules/express/lib/router/index.js:317:13)
    at /usr/local/share/.config/yarn/global/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/local/share/.config/yarn/global/node_modules/express/lib/router/index.js:335:12)
    at next (/usr/local/share/.config/yarn/global/node_modules/express/lib/router/index.js:275:10)
    at middleware (/usr/local/share/.config/yarn/global/node_modules/express-prom-bundle/src/index.js:174:5)
::ffff:172.29.0.1 - - [22/Sep/2022:23:31:07 +0000] "POST /s3/multipart/FqHx7wOxKS8ASbAWYK7ZtEfpWFOT2h9KIX2uHTPm2EZ.k1INl8vxfdpH7KBXhLTii1WL7GeDLzLcAKOW0vmxKhfCrcUCRMgHGdxEd5Nwxr._omBrtqOQFuY.Fl9nX.Vy/complete?key=videos%2Fuploads%2Ff86367432cef879b-4d84eb44-thewoods_weddingfilm_1.mp4 HTTP/1.1" 413 211 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"

It will always give out a 413 on the last request with about 188k of payload describing all the parts.

I've tried anything including:

var bodyParser = require("body-parser");
app.use(bodyParser.json({ limit: "50mb" }));
app.use(bodyParser.urlencoded({limit: "50mb", extended: false}));

but it has no effect. I've been spending months on this problem, read every article, complaint, issue on the internet regarding this and still, no one knows why it's happening and no one knows how to resolve it.

Can anyone help?


Solution

  • This is a known issue with the S3 plugin. It is fixed in the latest version of Uppy, but Companion is still on an older version. You can use the S3 Multipart plugin directly, which is what Companion uses under the hood.

    const Uppy = require('@uppy/core')
    const AwsS3Multipart = require('@uppy/aws-s3-multipart')
    const uppy = new Uppy()
    uppy.use(AwsS3Multipart, {
      companionUrl: 'https://companion.uppy.io',
      companionCookiesRule: 'same-origin',
      limit: 5,
      getUploadParameters (file) {
        return {
          method: 'post',
          endpoint: 'https://companion.uppy.io/s3/multipart',
          fields: {
            filename: file.name,
            size: file.size,
            contentType: file.type
          }
        }
      }
    })
    uppy.on('upload-success', (file, data) => {
      console.log('Upload successful', file, data)
    })
    uppy.on('upload-error', (file, error) => {
      console.log('Upload error', file, error) 
    })
    uppy.addFile({
      name: 'test.txt',
      type: 'text/plain',
      data: new Blob(['hello world'], { type: 'text/plain' })
    })
    uppy.upload() 
    

    The S3 Multipart plugin is a bit more complicated to use than the S3 plugin, but it is more flexible. It allows you to upload files larger than 5GB, and it allows you to upload files in parallel. It also allows you to upload files to S3-compatible services like Minio. The S3 plugin is a bit simpler to use, but it has some limitations. It doesn’t allow you to upload files larger than 5GB, and it doesn’t allow you to upload files in parallel. It also doesn’t allow you to upload files to S3-compatible services like Minio.