NodeJS lida com upload de arquivo
No Express4, Req.files foi undefined ; O mais usado agora pode ser formidable . Você sabe que ele tem um evento progress , então você está muito feliz. A barra de progresso da versão inferior do IE é uma chance; Ok, tente:
forma .on ('error', function (err) {console.log (err);}) .on ('abortado', function () {console.log ('abortado');}) .on ('progresso', função (bytesreceived, bytesexpeted) {var ' n = parseint (parsefloat (bytesreceived/bytesexpeed) .Tofixed (2)*100);Sim, você está feliz em ver que o console imprime uma série de valores de progresso conforme o esperado; Então, vá mais longe;
form. ('Progresso', função (bytesreceived, bytesexpeed) {var n = parseint (parsefloat (bytesReceived/bytesexpeed) .tofixed (2)*100); res.; }); O método call é exibir o valor de progresso na página; Infelizmente, você pode ver apenas os últimos 100%e não pode ver o valor de progresso detalhado específico enviado; Explore novamente ...
Em seguida, vamos mudar a ideia, experimentar, salvar o valor de progresso na session e adicionar uma solicitação adicional para pesquisar o valor do progresso. Oh, não é ruim! Para garantir que o valor de progresso solicitado seja o valor de progresso que você carrega desta vez, em vez do valor de progresso de outros uploads, você precisa concordar com um valor token na solicitação enviada e na solicitação adicional; Agora, outra pergunta é como obter esse token ao solicitar. Como o corpo de solicitação do upload do arquivo está na Request Payload , req.body não pode obter o valor trado por ele e não quero analisar essa pilha, é claro que também não posso analisar; É melhor colocá -lo no url , o problema é que às vezes você precisa atualizar duas vezes para atualizar token , o que não é bom! Como último recurso, vou colocá -lo no cookie !
var cookies = function () {var cks = req.headers.cookie.split (';'), obj = {}; para (var i = 0; i <cks.length; i ++) {obj [cks [i] .split ('=') [0] .place (// s+/ig, '')] = unescape (cks [i] .split ('=') [1]); } retornar obj; } (); var QueryToken = Cookies .__ token__; form. ('Progresso', função (bytesreceived, bytesexpeed) {var n = parseInt (parsefloat (form.bytesreceived/form.bytesexpeted) .tofixed (2)*100); if (req.session ['file'+weryToken]. req.session ['arquivo'+querytoken] = {token: QueryToken, porcentagem: n}};Para o IE789, vim pesquisar o valor do progresso. Eu me perdoo, mas meu coração dói;
var getData = function () {$ .Post ('/uploader', {getFileInfo: 1, uploadToken: utils.cookie.getcookie ('__ token__')}) .Then (function (getd) {console.log (data); se (dados) {getddat) (get) {console.log); se (data). Ligue para (Pros.Percent); } getData (); O método call é exibir o valor de progresso na página; Infelizmente, você pode ver apenas os últimos 100%e não pode ver o valor de progresso detalhado específico enviado; Explore novamente ...
Ok, eu caí nisso novamente; Mas ainda sinto que algo está errado, não há problema com a pesquisa do Ajax. O problema é que session precisa esperar até que o upload seja concluído antes de ter um valor, para que eu possa ver apenas 100%e não consigo ver o valor de progresso detalhado; Penso que em andamento, o res.write anterior e essa req.session foram suspensos, mas salva os resultados de cada execução até que progress seja liberado, para que eu possa ver apenas 100%; Não estou com vontade de ler o código -fonte de formidable , é claro que não consigo entender, então acho que isso primeiro!
Como a pesquisa ajax é boa, não é fácil salvá -la na session . Se realmente não funcionar, tente no global . Não será capaz de enfiar um valor no objeto global e o pendurá. Se fizer uma pequena mudança, será colocada em global :
form. ('Progresso', função (bytesreceived, bytesexpeed) {var n = parseInt (parsefloat (form.bytesreceived/form.bytesexpeted) .tofixed (2)*100); if (global ['file'+querytoken]) {['Arquivo' '+, Global ['arquivo'+QueryToken] = {Token: QueryToken, porcentagem: n}};Continue pesquisando.
Linda, isso é tudo! O que vejo no Chrome é o mesmo que o progresso do HTML5, mas parecerá um pouco preso no IE789, mas você ainda pode ver o valor detalhado do progresso; Afinal, os navegadores antigos não são bons, você sabe; E, toda vez que você faz upload, você coloca o valor em global , então precisa limpá -lo adequadamente. Depois que o arquivo for enviado, você pode transferi -lo para o diretório especificado global['file'+queryToken]=null ;
No entanto, a pesquisa significa muitos pedidos um após o outro, e pode haver problemas aqui; Se você não limitar, o valor de progresso será solicitado uma vez a cada intervalo de 500 mm; Bem, a barra de progresso do IE789 é resolvida assim, e acordou -se em jogar fora o flash; Embora essa pesquisa seja compatível com todos os navegadores, ainda é um desperdício de muitos pedidos. Vamos fazer um julgamento, continue html5 fora do IE789!
Na verdade, se você medir, qual é mais digno, mais um Flash Upload ou solicitação extra? Perdoe -me por não entender o Flash, não vou dizer muito. De qualquer forma, não gosto de adicionar arquivos extras à página;
Resumir
Ainda existem muitos detalhes sobre os componentes de upload de arquivos. Originalmente, eu queria fazer um arquivo JS, mas depois pensei que, para ser mais reutilizável, seria melhor fazê -lo como uma página independente. Se você precisar enviá -lo, apenas o Itame, o que é definitivamente muito melhor do que criar um arquivo JS. O acima é o conteúdo inteiro deste artigo. Espero que possa ajudá -lo em seu estudo ou trabalho. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar.