Rails: a melhor maneira de permitir que os usuários façam upload de imagens para uma pasta vinculada do Dropbox ou "nosso" armazenamento no Amazon S3

Diferente de H

Estou trabalhando em um projeto em que o usuário entra em um "stream". Durante a configuração do stream, a pessoa que está criando o stream (o criador do stream) pode escolher:

  1. Faça upload de todas as fotos adicionadas ao stream pelos membros em nossa solução de hospedagem (S3)
  2. Faça upload de todas as fotos adicionadas ao stream por membros para a pasta de autenticação Dropbox do próprio criador do stream

No futuro, gostaria de adicionar mais provedores de armazenamento (como Drive, Onesky etc)

Tenho algumas perguntas diferentes a respeito de como resolver isso.

  1. Qual deve ser a estrutura do banco de dados para fotos? No momento, tenho apenas photo_url, mas isso não será fácil de gerenciar de uma perspectiva de dados com urls pré-assinados e quando há diferentes maneiras de enviar uma foto (s3, caixa de depósito etc.)
  2. Como os tokens de acesso para cada provedor de armazenamento devem ser armazenados? Lembre-se de que apenas o access_token do criador do stream será armazenado e todos que estiverem no stream compartilharão esse token ao enviar fotos
  3. Vou adicionar iOS e clientes da web no futuro, que farão um upload direto para o provedor de armazenamento e ignorarão o servidor para evitar uma carga pesada no servidor
Sam Hartman

No que diz respeito ao armazenamento do banco de dados, seu aplicativo deve ditar a estrutura com base na interface que você apresenta ao usuário e ao fluxo. Se você tem usuários que carregam uma foto e eles não podem escolher o URI, e você não tem nenhuma hierarquia dentro de um stream, então eu recomendo armazenar apenas um ID e um stream_id em sua tabela de fotos principal.

Portanto, no mínimo, você pode ter algo parecido com

create table photos(id integer primary key, stream_id integer references streams(id) not null);

Mas você provavelmente também deseja uma descrição e outras informações que sejam independentes do armazenamento.

A tabela de fluxos teria todas as informações genéricas sobre um fluxo, mas teria uma associação polimórfica a uma classe dependente do tipo de fluxo. Portanto, você pode usar essa associação para obter uma instância de S3Stream ou DropBoxStream com base em qual fluxo real foi usado. Essa instância (também um recurso ActiveRecord) pode armazenar a chave de acesso e, para coisas como caixa de depósito, o caminho para a pasta etc. Além disso, essa instância pode fornecer métodos para construir um URI dado seu objeto Photo. Se uma tecnologia específica precisar armazenar URIs assinados em cache, digamos que o objeto S3Stream poderia fazer referência a um modelo S3SignedUrl onde os URIs são assinados. Se descobrir que o código de URL assinado é semelhante entre DropBox e S3, então talvez você tenha um único modelo SignedUrl.

Ao projetar os clientes ios e Android, é fundamental que eles não tenham acesso aos tokens de acesso do proprietário do stream. Em vez disso, você precisará fazer toda a assinatura dentro de seu aplicativo de servidor. Você não gostaria que o comprometimento de um dispositivo levasse à exposição do token de acesso, criando problemas de cobrança, bem como exposições de privacidade. Espero que isto ajude.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados