Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Uso de coluna do tipo BLOB no Oracle APEX

Armazenando e acessando anexos de arquivos em tipos de dados BLOB por meio do Oracle APEX


Aqui está o design do esquema para a tabela que usei, que contém uma coluna de dados do tipo BLOB. Nota:este não será o desenho da solução final; apenas acompanhe as alterações à medida que elas surgem para que você possa entender o que descobri sobre algumas limitações dos assistentes de criação de formulários e relatórios do APEX.

Primeira tentativa:configuração da tabela, formulário e relatório do APEX


Tabela:MY_DOC_STACK Primeira tentativa de layout



A coluna DOC_FILE é o tipo BLOB que armazena o anexo do documento real. Esta é a aparência do Formulário e do Relatório criado com o assistente de Aplicação APEX que aponta diretamente para a tabela:

ADICIONAR um DOCUMENTO ao campo digitado BLOB



A consulta do relatório parece funcionar conforme mostrado abaixo:



Aqui está uma lista de mais registros com anexos de documentos:

Saída de relatório de amostra com vários registros



O problema é ao tentar baixar o arquivo que foi colocado no campo BLOB:



É sutil na imagem, mas o tipo mime identificado:Application/Octet-Stream é um indicador de que o formulário APEX perdeu o controle do tipo de arquivo (Microsoft Word, docx) que acabei de enviar. O arquivo salvo é apenas um monte de caracteres de lixo. Tentar alterar a extensão do arquivo também não ajuda.

Segunda tentativa (revisada):ajustes no design do aplicativo APEX para manipulação de blobs/documentos


Embora as regiões do aplicativo e seus componentes não tenham funcionado imediatamente após a conclusão do assistente, há apenas algumas pequenas edições para colocá-lo em condições de funcionamento. Inspeção mais detalhada do elemento de formulário PX_DOC_FILE mostra que os elementos do formulário BLOB requerem algumas meta-informações adicionais sobre o arquivo anexado ao registro:



Fui em frente e defini as colunas adicionais e adicionei-as à tabela contendo BLOB (MY_DOC_STACK), ao formulário de upload do Apex e à definição da região do relatório.



Observe que os nomes das colunas (para simplificar) foram feitos da mesma forma que os requisitos do elemento de formulário Blob DOC_FILE .

Formulário Apex de anexo de documento revisado



Inicialmente, pensei que era preciso ser inteligente para antecipar todos os valores possíveis de Tipos Mime (msword, pdf, zip, etc.), mas isso era desnecessário. Da mesma forma para os outros campos reservados para o tipo de caractere e as últimas colunas atualizadas.

Relatório de upload de blob de documento revisado


Discussão do resultado do relatório revisado


  1. [Proprietário:AUDREY HEPBURN]:forcei o MIME_TYPE com meu formulário para "Application/msword"; embora o arquivo que eu carreguei fosse do tipo ".docx", baixá-lo de volta pela página do Apex o salvou em meu cliente local como um formato ".doc" (o antigo formato do MS Word).

  2. [Proprietário:CHEVY CHASE]:desta vez, MIME_TYPE não foi inserido e o processo/ação do formulário do Apex adicionou isso ao registro quando ele foi criado:

    application/vnd.openxmlformats-officedocument.wordprocessingml.document

    Este provavelmente é o formato designado pelo Microsoft Office 2013 . O FILE_NAME value foi definido pelo usuário e a extensão .docx foi adicionada explicitamente. O resultado foi que o download do arquivo levou o usuário a abrir o arquivo usando o aplicativo correto no meu computador cliente:MS Word (versão 2013).

  3. [Proprietário:CARRIE FISHER]:Igual ao caso de teste (2), mas usando um Adobe PDF (Portable Document Format). Mesmo comportamento, exceto o MIME_TYPE identificou-se como application/pdf; arquivo aberto como esperado.

Mais discussão:

Todo esse problema é das APIs DML genéricas que o Apex usa para gerenciar inserções, atualizações e exclusões do esquema do aplicativo, provavelmente faz parte do fortalecimento do Apex contra ataques de injeção de SQL. O INSERT direto e SELECT instruções usadas em seu cliente SQL não é da mesma forma que um design de formulário padrão (de um assistente de aplicativo) é configurado para gerenciar transações DML.



Observe que a página processa:Process Row of MY_DOC_STACK parece mais acionado por parâmetros. Se houver uma operação DML em algum lugar, ela será baseada primeiro na triagem cuidadosa de cada variável de entrada enviada por meio do formulário do Apex.

Há muitas outras maneiras pelas quais o Apex pode gerenciar transações DML; ... esta solução se concentra no que provavelmente foi encontrado pelo OP.

Boa sorte!