Você pode ter notado, nos últimos meses, muitos commits relacionados a uploads no core do Discourse. Isso faz parte de um esforço geral no core para substituir o uso do jQuery file upload em nossa base de código, como parte de um esforço ainda mais amplo para substituir o uso do próprio jQuery em nossa base de código. O jQuery file uploader é um projeto muito antigo e faz parte do core do Discourse desde o início. Acho que o usei durante toda a minha carreira em outros projetos também. Mas é hora de aposentar o Velho Confiável:
Substituímos o jQuery file upload (e em breve também substituiremos outra biblioteca, resumable.js) por uma biblioteca chamada Uppy. Esta é uma biblioteca de upload muito mais moderna, facilmente extensível com plugins e capaz de lidar com todos os diferentes fluxos de trabalho que apresentamos a ela. Importante, isso nos permite fazer uploads multipart diretos para o S3 do cliente Discourse, em vez de ter que enviar arquivos grandes através de nossa API.
O composer agora usa o Uppy para todos os uploads, e muitos outros locais no aplicativo o utilizam (uploads de avatar, uploads de fundo de perfil, etc.). Os últimos pontos de resistência desaparecerão nas próximas semanas. Esta deve ser uma mudança em grande parte invisível para a maioria dos usuários, mas os autores de plugins e componentes de temas precisarão fazer algumas alterações.
API de Plugins
Pré-processadores
Todos os pré-processadores de upload agora precisam ser escritos como um plugin Uppy. Esses plugins são bastante simples de escrever e usam um fluxo de trabalho simples baseado em promessas. Um pré-processador de upload pode modificar um arquivo ou adicionar metadados a ele antes que o Uppy o carregue para o S3 ou para o endpoint /uploads.json. Já temos vários pré-processadores no core que você pode usar como referência ao escrever os seus:
- discourse/app/assets/javascripts/discourse/app/lib/uppy-checksum-plugin.js at 6662101208089def86ed18a81ac90d1c52670569 · discourse/discourse · GitHub
- discourse/app/assets/javascripts/discourse/app/lib/uppy-media-optimization-plugin.js at 6662101208089def86ed18a81ac90d1c52670569 · discourse/discourse · GitHub
Os pré-processadores de upload para o composer são registrados via api.addComposerUploadPreProcessor usando a API de plugins:
Manipuladores de Upload
Os manipuladores de upload não são escritos como plugins Uppy; eles ainda funcionam como sempre, com uma pequena alteração. Agora, quando um arquivo corresponde a uma extensão registrada em um manipulador de upload, todos os arquivos correspondentes serão enviados de uma vez. Anteriormente, apenas um arquivo por vez era enviado ao manipulador de upload, e agora um array é enviado:
Arquivos manipulados por um manipulador de upload não serão processados posteriormente no pipeline de upload do Uppy. Os pré-processadores são executados antes que os manipuladores de upload sejam invocados.
Uploads Diretos Multipart para S3
Anteriormente, mencionei que nosso uso do Uppy também nos permite fazer uploads multipart diretos para o S3 a partir da interface do usuário. Para habilitar este recurso, você precisa definir a configuração do site enable_direct_s3_uploads como true.
Se você estiver hospedado conosco, as permissões S3 relevantes já foram aplicadas ao seu bucket. No entanto, se você estiver auto-hospedando, várias permissões e regras CORS devem ser configuradas em seu bucket para que isso funcione.
Para as regras CORS, você só precisa executar a tarefa rake s3:ensure_cors_rules com rake s3:ensure_cors_rules. Ela adicionará as seguintes regras ao seu bucket, desde que você tenha as permissões S3:GetBucketCors e S3:PutBucketCors habilitadas para qualquer chave de acesso e segredo que você configurou para suas credenciais S3 em sua instância do Discourse.
{
"AllowedHeaders": [
"Authorization",
"Content-Disposition",
"Content-Type"
],
"AllowedMethods": [
"GET",
"HEAD",
"PUT"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
Para as permissões, você precisará ter as seguintes permissões habilitadas para qualquer chave de acesso e segredo que você configurou para suas credenciais S3 em sua instância do Discourse.
{
"Sid": "YourSid",
"Effect": "Allow",
"Action": [
"s3:PutObjectVersionAcl",
"s3:PutObjectAcl",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:DeleteObject",
"s3:CreateMultipartUpload",
"s3:CompleteMultipartUpload",
"s3:AbortMultipartUpload"
],
"Resource": [
"YOUR_RESOURCE"
]
}
Este tem sido um processo de vários meses e ainda não terminamos! Postarei neste tópico quando estivermos prestes a remover completamente o jQuery file uploader e o resumable.js do core do Discourse. Me avise se tiver alguma dúvida sobre o que postei aqui!

