Javascript blob type binary options


A função atob decodificará uma seqüência codificada em base64 em uma nova seqüência com um caractere para cada byte dos dados binários. Cada ponto de código de caracteres (charCode) será o valor do byte. Podemos criar uma matriz de valores de byte aplicando isso usando o método. charCodeAt para cada caractere na seqüência de caracteres. Você pode converter essa matriz de valores de byte em uma matriz de bytes digitados real, passando-o para o construtor Uint8Array. Isso, por sua vez, pode ser convertido em um Blob, envolvendo-o em uma matriz passando-o para o construtor Blob. O código acima funciona. No entanto, o desempenho pode ser melhorado um pouco processando o byteCharacters em fatias menores, em vez de todos de uma vez. Em meu teste áspero 512 bytes parece ser um bom tamanho de fatia. Isso nos dá a seguinte função. Exemplo completo: respondeu Apr 26 13 at 21:51 Note que atob isn39t suportado pelo IE9 e abaixo, apenas IE10. Mas então, isso é verdade para matrizes e blobs tipados também, então. -) ndash T. J. Crowder Apr 26 13 at 21:55 Para melhor performace (testado em FF20) use para em vez de chamar Array. prototype. map. call (slice, charCodeFromCharacter) e prealocate array byteNumbers new Array (slice. length). Eu notei, que o Internet Explorer 11 fica incrivelmente lento ao cortar os dados como jeremy sugerido. Isso é verdade para o Chrome, mas o IE parece ter um problema ao passar os dados cortados para o Blob-Constructor. Na minha máquina, passando 5 MB de dados faz IE crash e consumo de memória está passando pelo telhado. O Chrome cria o blob em nenhum momento. Executar este código para um comparismo: Então eu decidi incluir ambos os métodos descritos por jeremy em uma função. Créditos vão para ele para this. Working com arquivos em JavaScript, Parte 5: Blobs Postado em 05 de junho de 2017 por Nicholas C. Zakas Até agora, esta série de posts focou em interagir com arquivos especificados pelo usuário e acessado via Arquivar objetos. O objeto File é na verdade uma versão mais específica de um Blob. Que representa um pedaço de dados binários. As propriedades tamanho e tipo existem em objetos Blob e são herdadas por Arquivo. Na maioria dos casos, Blob s e File s podem ser usados ​​nos mesmos lugares. Por exemplo, você pode ler um Blob usando um FileReader e você pode criar um URL de objeto de um Blob usando URL. createObjectURL (). Uma das coisas interessantes que você pode fazer com Blob s (e, portanto, também File s) é criar um novo Blob baseado em uma subseção de outro. Como cada Blob representa apenas ponteiros de dados em vez de dados, você pode criar rapidamente novos objetos Blob apontando para sub-partes de outros. Isso é realizado usando o método slice (). Você pode estar familiarizado com slice () em strings e arrays, e aquele para Blob s se comporta de maneira semelhante. O método aceita três argumentos: o deslocamento do byte inicial, o deslocamento do byte final e um tipo MIME opcional para aplicar ao Blob. Se o tipo MIME isn8217t especificado, o novo Blob tem o mesmo tipo de MIME que o original. Suporte de navegador para slice () isn8217t ainda onipresente, com o Firefox suportando via mozSlice () e webkitSlice () no Chrome (nenhum outro navegador suporta este método atualmente). Aqui um exemplo: Você pode então usar esta função para, por exemplo, dividir um arquivo grande para carregá-lo em pedaços. Cada novo Blob sendo produzido é independente do original, mesmo que os dados de cada referência tenha uma sobreposição. Os engenheiros do Flickr usam blob slicing para ler as informações Exif de fotos que são carregadas 1 em vez de aguardar no servidor. Quando o arquivo é selecionado, a página de upload do Flickr começa simultaneamente a fazer o upload do arquivo, bem como a ler as informações Exif da foto. Isso permite que eles dêem uma visualização dos metadados extraídos na página enquanto o arquivo está sendo carregado. Criando Blobs da maneira antiga Muito em breve depois que os objetos File começaram a aparecer nos navegadores, os desenvolvedores perceberam que os objetos Blob eram realmente bastante poderosos e assim queriam ser capazes de criá-los sem a interação do usuário. Afinal, todos os dados podem ser representados em um Blob. Ele doesn8217t necessariamente tem que ser amarrado a um arquivo. Os navegadores responderam rapidamente criando o BlobBuilder. Um tipo cuja única finalidade é envolver alguns dados em um objeto Blob. Este é um tipo não-padrão e foi implementado no Firefox (como MozBlobBuilder), Internet Explorer 10 (como MSBlobBuilder) e Chrome (como WebKitBlobBuilder). O BlobBuilder funciona criando uma nova instância e chamando o método append () com uma string, ArrayBuffer. Ou Blob. Uma vez que todos os dados foram adicionados, você chama getBlob () e passa um tipo MIME opcional que deve ser aplicado ao Blob. Um exemplo: A capacidade de criar URLs para partes arbitrárias de dados é incrivelmente poderosa, permitindo que você crie dinamicamente objetos que podem ser tratados como arquivos no navegador. Você poderia, por exemplo, usar um Blob para criar um web worker sem ter um arquivo separado para o código do trabalhador. Esta técnica foi escrita em The Basics of Web Workers 2: Este código cria um script simples e cria um URL de objeto. O URL do objeto é atribuído a um web worker no lugar de um URL de script. Você pode chamar append () quantas vezes quiser, criando o conteúdo do Blob. Criando Blobs a nova maneira Como os desenvolvedores continuavam clamando por uma maneira de criar objetos Blob diretamente e navegadores que chegavam com o BlobBuilder. Foi decidido adicionar um construtor Blob. Esse construtor agora faz parte da especificação e será a maneira como os objetos Blob serão criados no futuro. O construtor aceita dois argumentos. O primeiro é uma matriz de partes para combinar em um Blob. Estes seriam os mesmos valores passados ​​para o método append () do BlobBuilder e podem ser qualquer número de strings, Blob s e ArrayBuffer s. O segundo argumento é um objeto que contém propriedades para a recém-criada Blob. Existem atualmente duas propriedades definidas, digite. Que especifica o tipo MIME do Blob. E terminações. Que pode ser 8220transparent8221 (padrão) ou 8220native8221. Here8217s um exemplo: Como você pode ver, isso é muito mais simples do que usar BlobBuilder. O construtor Blob está atualmente nas compilações noturnas do Chrome e estará no Firefox 13. Outros navegadores ainda não anunciaram planos para implementar esse construtor, no entanto, ele agora faz parte do File API 3 padrão e deve ser implementado universalmente. Conclusão Esta é a última parte da série sobre como trabalhar com arquivos em JavaScript. Como espero que você aprendeu, a API de arquivos é incrivelmente poderosa e abre novas formas de trabalhar com arquivos em aplicativos da Web. Você não precisa mais ficar com caixas de upload de arquivos simples quando os usuários precisam fazer o upload de arquivos e agora que você pode ler os arquivos no cliente, isso abre todos os tipos de possibilidades para a manipulação do lado do cliente. Você pode redimensionar uma imagem que é muito grande antes de carregar (usando FileReader e ltcanvasgt), você pode criar um editor de texto que funciona puramente no navegador, você pode dividir arquivos grandes para fazer upload peça por peça. As possibilidades não são intermináveis, mas estão muito perto. Referências Disclaimer: Todos os pontos de vista e opiniões expressas neste artigo são as de Nicholas C. Zakas e não, de qualquer forma, refletem as do meu empregador, meus colegas, Wrox Publishing. OReilly Publishing. Ou qualquer outra pessoa. Eu falo somente para mim, não para eles. Clipchamp API: the Blob Output Option Este artigo explica a finalidade e o uso da opção de saída Blob que está disponível nos planos Enterprise do Clipchamp API (anteriormente conhecido como botão Clipchamp). Nós ilustramos quando favorecer a opção de saída Blob sobre nossas opções pré-enlatadas de upload de vídeo, como a capacidade incorporada de nos enviar os vídeos dos usuários para as contas do AWS S3 ou do Microsoft Azure. O que é um Blob e o que faz a opção de saída Blob do Blob é um acrônimo que significa Binary Large Object. Em JavaScript, um Blob é um tipo de dados que representa um identificador opaco para um bloco de dados não estruturado, normalmente grande, como os dados binários que compõem um arquivo de vídeo. A API JavaScript Blob está disponível em todos os navegadores modernos. Você pode pensar em uma instância do Blob como um identificador de arquivo que pode representar alguns dados na memória, dados binários recebidos de XMLHttpRequest. Dados armazenados persistentemente no sistema de arquivos do cliente usando as APIs IndexedDB ou FileWriter. Blobs podem até ser vistas em outras instâncias do Blob. Por exemplo, você pode criar um wrapper Blob a partir de outras instâncias do Blob, assim: Internamente, a API Clipchamp usa Blobs extensivamente para abstrair de técnicas específicas do navegador para armazenar arquivos de vídeo de saída (ie arquivos de vídeo gravados, convertidos ou compactados com o Clipchamp API). Com a opção de saída Blob, fazemos uma entrega do lado do cliente de vídeos de saída disponíveis como parte de nossa API de Javascript. Usar a opção de saída Blob é confinado a cenários onde usar nossas opções de upload de vídeo incorporadas não é viável. Estes incluem: O aplicativo precisa executar algumas etapas personalizadas de pós-processamento do lado do cliente depois que os dados de vídeo de saída se tornaram disponíveis. Por exemplo, você pode querer incorporar o vídeo de saída em um player de vídeo HTML5 e reproduzi-lo para o usuário antes de carregá-lo para o servidor back-end. Você não pode usar qualquer uma das nossas (constantemente crescente lista de) metas de upload embutidas por razões regulamentares (legais), obstáculos técnicos ou considerações de custo e armazene os vídeos enviados em seus próprios servidores. Geralmente, recomendamos que você considere usar os alvos de upload incorporados antes de optar pela saída Blob. Isso não só economiza tempo e esforço para codificar o upload para seus próprios servidores você mesmo. Ele também fará você se beneficiar de toda a robustez que construímos no protocolo de upload, incluindo mecanismos de repetição em condições de rede esboçado e protocolos de segurança robustos para proteger seus vídeos de terceiros maliciosos enquanto faz o upload. Como usar a opção de saída Blob Para usar a opção de saída Blob, você precisa se inscrever no plano Enterprise da API Clipchamp. Entre em contato com salesclipchamp para discutir suas necessidades específicas. Usar a opção de saída Blob essencialmente requer que você ajuste a maneira como invoca a API Clipchamp de duas maneiras: Use blob como o valor do parâmetro de saída. Fornecer uma função de retorno de chamada no parâmetro onVideoCreated. Usando a opção de saída Blob, seguiria este padrão: No exemplo acima, assumimos que você usa jQuery em conjunto com a API Clipchamp e escolhe usar o botão Clipchamp-style, que injetamos no DOM (dentro do elemento wrapper que é Selecionado com o seletor jQuery). Naturalmente, usar a opção de saída Blob não se limita a esse uso da API Clipchamp. Ou seja, você pode usar a opção de saída Blob sem jQuery ou ao usar o sabor de botão personalizado de nossa API. A Clipchamp API chamará o callback onVideoCreated com o vídeo de saída, que é uma instância do Blob. A seguir, descreveremos 3 maneiras de processar esse blob dentro do callback onVideoCreated: Processamento síncrono (desencorajado) A maneira mais simples, embora desencorajada de implementar a função callback onVideoCreated é processar outputVideoBlob apenas de forma síncrona. Fazer isso requer que você termine todo o uso do vídeo de saída de forma síncrona, de modo que quando sua implementação de onVideoCreated retorna o controle para a API Clipchamp, podemos destruir imediatamente o objeto outputVideoBlob e excluir seu armazenamento persistente subjacente. Uma implementação síncrona de onVideoCreated é fortemente desencorajada porque em JavaScript, poucas coisas podem ser feitas de forma síncrona. Por exemplo, fora de um Worker, você não pode mesmo copiar profundamente um objeto Blob em outro objeto Blob de forma síncrona. O que você pode ser capaz de fazer é executar um XMLHttpRequest síncrona onde você envia o outputVideoBlob para o seu servidor back-end: No entanto, a execução de solicitações HTTP síncronas é obsoleta na maioria dos navegadores e por uma boa razão: uma operação síncrona bloqueia o segmento UI, Processo de renderização. Nosso forte conselho é, portanto, não implementar onVideoCreated como uma função síncrona, mas use uma das seguintes duas implementações assíncronas em vez disso. Usando retornos de chamada A maneira mais simples de fazer onVideoCreated assíncrono é adicionar um número de parâmetros de retorno de chamada que você precisa para invocar de forma assíncrona para sinalizar a conclusão bem-sucedida (ou sem êxito) de manipulação do outputVideoBlob no seu código. Por exemplo, a contraparte assíncrona de uma funcionalidade de upload de vídeo simples poderia ser implementada da seguinte forma: Observe como adicionamos dois parâmetros à assinatura no onVideoCreated. DoneCallback e failCallback. Depois de adicioná-los à assinatura da função, a API Clipchamp será inteligente o suficiente para passar uma função para cada. Seu código então precisa invocar o doneCallback ou failCallback. Dependendo se ou não o seu pós-processamento de outputVideoBlob foi bem sucedido (ou sem êxito). Quando o seu pós-processamento se limita a incluir de forma assíncrona o vídeo para um ponto de extremidade HTTP (S) do seu, você deve vincular o sucesso dessa operação de upload à invocação de doneCallback ou failCallback. Ao fazê-lo, você está livre para atrasar invocando doneCallback até que a operação de pós-processamento completo seja finalmente concluída. Da mesma forma, você só precisa chamar failCallback se ele tiver falhado. Por exemplo, você pode implementar um protocolo de upload de chunking simples baseado em cabeçalhos de solicitação HTTP Content-Range, onde você divide outputVideoBlob em pedaços menores e envia cada um em um pedido HTTP separado (desde que seu servidor possa lidar com uploads fragmentados): Implementação ligeiramente mais complexa da função onVideoCreated. Para uma melhor modularidade, define duas funções aninhadas: uploadSingleChunk (assincronamente) envia uma solicitação POST com um pedaço de 1 MB para um HTTPS endoint. Para sinalizar o fragmento de outputVideoBlob que está sendo enviado com essa solicitação, definimos o cabeçalho Content-Range para o intervalo de byte correspondente. Observe que o valor superior nos bytes. Intervalo é inclusivo. UploadNextChunk percorre recursivamente sobre outputVideoBlob. Cortando fora pedaços de 1 MB que passa para uploadSingleChunk. Se uploadSingleChunk for bem-sucedido, recursivamente invoca uploadNextChunk com o próximo deslocamento de bloco. Caso contrário, tentará enviar o pedaço atual após um segundo. Se falhar em outra hora, nós invocamos o failCallback (global). Uma vez que o offset excedeu o tamanho de outputVideoBlob. Nós invocamos o (global) doneCallback. Na realidade, uma política de repetição de uploads fragmentados seria ainda mais robusta com uma estratégia de backoff pontual exponencial. Usando promessas As promessas geralmente constituem um modelo de programação superior, substituindo callbacks por um conceito (stateful) onde uma função assíncrona retorna um objeto promise. Esse objeto de promessa permite registrar retornos de chamada que são invocados quando a promessa é resolvida ou rejeitada, ou seja, a função assíncrona teve êxito ou falhou. A API Clipchamp permite que você use promessas em vez de callbacks, suportando tanto o próximo padrão Promise A quanto os objetos diferidos jQuerys. Em ambos os casos, sua implementação de onVideoCreated precisa retornar um objeto de promessa e pode então (assincronamente) resolver ou rejeitar essa promessa. O exemplo a seguir usa Promise A, que faz parte do padrão ECMAScript 6. A beleza das promessas não pára por aí, mas inclui a noção de ser encadeável. Na verdade, muitas das funções de utilitário jQuerys usam sua implementação diferida. Isso inclui funções jQuerys AJAX, que fornecem um wrapper de conveniência em torno de XMLHttpRequest: Observe como nós pacote outputVideoBlob em uma instância FormData, que garante que jQuery usa um multipart / form-data encoding. Progresso de sinalização Além de sinalizar o sucesso ou falha de seu pós-processamento assíncrono do outputVideoBlob. Você pode opcionalmente sinalizar o progresso de sua etapa de processamento para a API Clipchamp como um valor de porcentagem. Usaremos esse valor para exibir uma barra de progresso e calcular uma estimativa atempada para a duração restante antes da conclusão. Para fazer isso, você pode adicionar um terceiro notifyCallback para a assinatura de onVideoCreated ou usar a capacidade de relatório de progresso de seu objeto de promessa - observe que nem todas as promessas implementações apoio progresso relatórios, jQuery promete fazer embora: Ao contrário do doneCallback ou failCallback. O notifyCallback pode ser invocado várias vezes. Você deve certificar-se de passar valores de porcentagem crescente, como para certificar-se de que a barra de progresso nunca avança. O mesmo é verdadeiro para invocar a função de notificação da promessa jQuery. Para sinalizar o progresso de um upload de arquivo usando a API XMLHttpRequest, você pode fazer o seguinte: Comentários (0)

Comments