Encontrei esse requisito no meu trabalho e precisava usar o NodeJS para fazer upload de arquivos. Eu costumava saber apenas como fazer upload de arquivos através do navegador. Se eu uso o NodeJS, é equivalente a simular o comportamento do navegador. Depois do Google, percebi que o navegador simplesmente usa o protocolo HTTP para transmitir dados para o servidor. O protocolo específico é "RFC 1867 - Upload de arquivo baseado em formulário em HTML". O upload de arquivos por meio de formulários no navegador é através deste protocolo. Podemos primeiro ver quais dados o navegador envia para o servidor e, em seguida, podemos implementar a função de upload de acordo com a cópia. Quando se trata de fazer upload de arquivos nos formulários, todos devem estar familiarizados com:
<Form Action = "http://www.qq.com/" method = "post"> <input type = "text" name = "text1" /> <r /> <input type = "text" name = "text2" /> <r /> <input type = "submit" /< /form
Ao enviar, você pode ver que os seguintes dados são enviados ao servidor usando Fiddler para capturar o pacote:
Post http://www.qq.com/ http/1.1
Host: www.qq.com
Comprimento de conteúdo: 23
Tipo de conteúdo: aplicativo/x-www-forma-urlncoded; charset = utf-8
Text1 = Hello & Text2 = World
Vale a pena notar que os padrões do tipo conteúdo para o aplicativo/x-www-forma-urlcoded, para que a mensagem seja codificada por URL. Por exemplo, "Hello" será codificado como%E4%BD%a0%E5%A5%BD.
Em seguida, vamos dar uma olhada em como o formulário é carregado. Todos devem estar familiarizados com:
<Form Action = "http://www.qq.com" method = "post" Enctype = "Multipart/form-data"> <input type = "file" name = "myfile"/> <input type = "submit" value = "submit"/> </form>
Em seguida, crie um novo arquivo de texto upload.txt com apenas o Word Hello World e upload -o. Usamos Fiddler para pegar o pacote. Podemos descobrir que o envio de dados passados é um pouco mais complicado (muitas outras linhas de solicitação não relacionadas foram removidas, como controle de cache e cookies):
Post http://www.qq.com/ http/1.1
Host: www.qq.com
Comprimento de conteúdo: 199
Tipo de conteúdo: multipart/form-dados; limite = --- webkitformBounderyWr3x7SXBYQQ4ZF5G
----- WebkitFormBoundaryWr3x7SXBYQQ4ZF5G
Disposição de conteúdo: Form-Data; name = "myFile"; filename = "upload.txt"
Tipo de conteúdo: texto/simples
Olá mundo
----- webkitformBoundaryWr3x7SXBYQQ4ZF5G--
De acordo com a definição de RFC 1867, precisamos gerar uma parte dos dados de limite. Esses dados não podem aparecer em outro lugar do conteúdo. Isso pode ser definido por você. O algoritmo de geração de cada navegador pode ser diferente. O limite acima é separar dados. Após gerar os dados separados, os dados separados podem ser colocados no tipo de conteúdo na cabeça e transmitidos ao servidor, ou seja, o tipo de conteúdo acima: multipart/formulário; limite = --- webkitformBounderyWr3x7SXBYQQ4ZF5G, Além disso, o conteúdo carregado precisa ser separado em vários segmentos com dados separados, e cada segmento de dados tem o nome do arquivo e o nome ao fazer o upload. O servidor usa esse nome para receber o arquivo e o tipo de arquivo do tipo conteúdo. Neste exemplo, texto/simples. Se a imagem PNG carregada for imagem/png, ela é imagem/png. Após uma linha em branco do tipo de arquivo, o conteúdo do arquivo carregado também é fácil de entender. Neste exemplo, o arquivo de texto carregado é para que o conteúdo possa ser exibido diretamente. Se o arquivo de imagem carregado for um arquivo binário, o violinista exibirá código ilegal. Após o término do conteúdo do arquivo, há uma linha em branco mais dados de limite.
Depois de entender os detalhes do formato de envio, a próxima etapa é usar o NodeJS para programá -lo e implementá -lo. Simplificando, basta enviar os dados para o servidor de acordo com o formato.
const http = requer ('http'); const fs = requer ('fs'); // O endereço postal é um php no serviço local, usado para testar se o upload é bem -sucedido var options = {hostName: 'localhost', port: 80, path: '/get.php', 'Method:' Post '} // Gereate Data se separar '--- webkitformBoundaryjlvkbqxtii0ygpab'; // Leia o conteúdo do arquivo que precisa ser carregado fs.readfile ('./ upload.txt', function (err, dados) {// Destaque o segmento de dados separado var payload = '-' + limaryKey + '/r/n' + 'content-disposition: form-data; name = "myFile"; filename = "uplroad.txt" e "name"/"myFile"; filename = "uplroad.txt" e " 'Content-Type: Texto/Plano/R/N/R/N'; Payload + = Data; Payload + = '/R/N--' + BoundaryKey + '-'; // Envie uma solicitação var req = http.request (opções, function (res) {res.SetEncoding ('utf8'); res.on ('Data',, function) {function) (function) (') (', ('); chunk);});}); req.on ('error', function (e) {console.error ("erro:"+e);}); // escreva limite, o tamanho dos dados a serem enviados e os dados em si para a solicitação req.setheader ('content-type', 'multipart/form-data; limite = '+limitekey+' '); req.setheader (' content-length ', buffer.byTeLength (carga de pagamento,' utf8 ')); req.write (carga paga); req.end ();});O foco deste artigo é entender o protocolo e implementá -lo com o código. Ainda existem muitas otimizações na organização de código.
Por fim, no Apache local, basta escrever um PHP para salvar o arquivo carregado para usar como teste:
<? php $ filepath = './upload.txt' ;move_uploaded_file($_files['myfile'biles
Além disso, de acordo com a RFC 1867, a função de fazer upload de vários arquivos ao mesmo tempo pode ser realizada. Isso não será descrito em detalhes aqui. Se necessário, consulte a RFC 1867 para obter uma implementação detalhada.
O acima é o upload do arquivo node.js introduzido pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!