当前位置: 首页 > 知识库问答 >
问题:

nodejs中的html文件共享

尚嘉勋
2023-03-14

我正在用Nodejs做一个聊天室。为此,我使用了express、socket.io和http。我正在寻找通过http服务器进行文件共享的选项。首选的文件格式是图像文件(.jpg或.png)和文本文件。但我做不到。我尝试使用html的input标记,但它没有将任何文件上传到服务器。

这是我的服务器端代码(server.js)

null

var express = require("express")
  , app = express()
  , http = require("http").createServer(app)
  , bodyParser = require("body-parser")
  , io = require("socket.io").listen(app.listen(3000))
  , _ = require("underscore");
const file = require('express-fileupload');
app.use(file());

var participants = [];

app.set("ipaddr", "127.0.0.1");


app.set("port", 8080);


app.set("views", __dirname + "/views");


app.set("view engine", "jade");


app.use(express.static("public", __dirname + "/public"));


app.use(bodyParser.json());

app.get("/", function(request, response) {

  response.render("index");

});

app.post("/message", function(request, response) {

  var message = request.body.message;

  if(_.isUndefined(message) || _.isEmpty(message.trim())) {
    return response.json(400, {error: "Message is invalid"});
  }

  var name = request.body.name;

  io.sockets.emit("incomingMessage", {message: message, name: name});
  response.json(200, {message: "Message received"});

});
io.on("connection", function(socket){
  socket.on("newUser", function(data) {
    participants.push({id: data.id, name: data.name});
    io.sockets.emit("newConnection", {participants: participants});
  });
  socket.on("nameChange", function(data) {
    _.findWhere(participants, {id: socket.id}).name = data.name;
    io.sockets.emit("nameChanged", {id: data.id, name: data.name});
  });

  socket.on("disconnect", function(data) {
    participants = _.without(participants,_.findWhere(participants, {id: socket.id}));
    io.sockets.emit("userDisconnected", {id: socket.id, sender:"system"});
  });

});
http.listen(app.get("port"), app.get("ipaddr"), function() {
  console.log("Server ready. IP address: " + app.get("ipaddr") + " ..port:" + app.get("port"));
});

null

这是客户端代码(index.js)

null

function init() {
  var url = document.domain;
  var socket = io.connect(url);
  var sId = '';
  function updateParticipants(mem) {
   $('#participants').html('');
   for (var i = 0; i < mem.length; i++) {
      $('#participants').append('<span id = ' + mem[i].id + '>' +
        mem[i].name + ' ' + (mem[i].id === sId ? '(You)' : '') + '<br> </span>');
    }
  }

  socket.on('connect', function () {
    sId = socket.io.engine.id;
    console.log('Connected ' + sId);
    socket.emit('newUser', {id: sId, name: $('#name').val()});
  });

  socket.on('newConnection', function (data) {

    updateParticipants(data.participants);
    $('#messages').prepend('<br> New user joined <hr>');
  });

  socket.on('userDisconnected', function(data) {
    $('#' + data.id).remove();
  });

  socket.on('nameChanged', function (data) {
    $('#' + data.id).html(data.name + ' ' + (data.id === sId ? '(You)' : '') + '<br> ');
  });

  socket.on('incomingMessage', function (data) {
    var message = data.message;
    var name = data.name;
    $('#messages').prepend('<b>' + name + '</b><br>' + message + '<h6 style = "color: green; font-size: 11px">'+new Date().toString()+'</h6>'+'<hr>');
  });

  socket.on('error', function (reason) {
    console.log('Unable to connect to server', reason);
  });

  function sendMsg() {
    var outgoingMessage = $('#outgoingMessage').val();
    var name = $('#name').val();
    $.ajax({
      url:  '/message',
      type: 'POST',
      contentType: 'application/json',
      dataType: 'json',
      data: JSON.stringify({message: outgoingMessage, name: name})
    });
  }
  function sendAttachment(){
  	var attachment=$('#attachment').val();
  	var name = $('#name').val();
    $.ajax({
      url:  '/message',
      type: 'POST',
      contentType: 'application/json',
      dataType: 'json',
      data: JSON.stringify({message: outgoingMessage, name: name})
    });
  }
  function msgKeyDown(event) {
    if (event.which == 13) {
      event.preventDefault();
      if ($('#outgoingMessage').val().trim().length <= 0) {
        return;
      }
      sendMsg();
      $('#outgoingMessage').val('');
      var att = $('#attachment').val();

    }
  }
  function msgKeyUp() {
    var outgoingMessageValue = $('#outgoingMessage').val();
    $('#send').attr('disabled', (outgoingMessageValue.trim()).length > 0 ? false : true);
  }

  function focusName() {
    var name = $('#name').val();
    socket.emit('nameChange', {id: sId, name: name});
  }

  $('#outgoingMessage').on('keydown', msgKeyDown);
  $('#outgoingMessage').on('keyup', msgKeyUp);
  $('#name').on('focusout', focusName);
  $('#send').on('click', sendMsg);
  $('#sendFile').on('click',sendAttachment);
}

$(document).on('ready', init);

null

对于前端,我制作了一个Jade文件(index.Jade)

null

doctype html
html
  head
    
    link(rel='stylesheet', href='http://fonts.googleapis.com/css?family=Open+Sans')
    link(rel='stylesheet', href='/css/style.css')   
    script(src='//code.jquery.com/jquery-1.11.0.min.js')
    script(src='/socket.io/socket.io.js')
    script(src='/js/index.js')
    title Chatroom
  body
    h1(style="color: red; text-align: center") Live ChatRoom
    div(style="color: red;")
      div.inlineBlock
        span Your name:
          input(type="text", value=" ", style="background-color: blue; color: orange; width: 300px; height:40px; font-size: 35px")#name
        br
        form#messageForm
          textarea(rows="7", cols="60", placeholder="Say something and press enter(maximum 300 characters)",maxlength=300, style ="background-color: black;color: yellow; font-size: 20px")#outgoingMessage
          br
          input(type="button", value="SEND", disabled=true, style="backround-color: purple; color:black; ")#send
      div.inlineBlock.topAligned
        b Participants
        br
        div(style = "color: gold")#participants
    div(style = "color: Yellow")#messages

null

有什么建议,我可以如何做文件共享的代码?psserver.js中的'express-fileupload'是一个npm包,我尝试用于文件共享,但不起作用。

共有1个答案

白祺然
2023-03-14

你看对了:

<input type="file" id="input>

下面是一个示例代码,它将在选择一个文件后通过WebSockets发送一个“image”事件。处理“Image”事件的逻辑应该与您的“IncomingMessage”类似,但我建议将它们分开。

document.getElementById("input").addEventListener("change", function (event) {

    // Prepeare file reader
    var file = event.target.files[0];
    var fileReader = new FileReader();

    fileReader.onloadend = function (event) {
      var image = event.target.result

      // Send an image event to the socket
      socket.emit("image", image);
    };
    // Read file
    fileReader.readAsDataURL(file);
  })

如果您希望显示来自WebSocket的图像,您可以简单地在image元素上设置“src”属性:

<img src="" id="output />

和监听WebSocket事件的JavaScript:

socket.on("image", function (image) {
    output.src = image;
  });

您可以在这里找到通过WebSockets发送图像的完整示例:https://medium.com/@getflowish/from-mobile-to-desktop-cross-device-communication-using-webSockets-f9c48f669c8

 类似资料:
  • 本文向大家介绍怎样在NodeJs中加载HTML文件?相关面试题,主要包含被问及怎样在NodeJs中加载HTML文件?时的应答技巧和注意事项,需要的朋友参考一下 开启http服务器 使用fs读取对应目录的文件 设置请求头 res.setHeader("Content-Type","text/html;charset=utf-8"); res.write(html字符串),调用res.end();获采

  • 当我将此zip输出从边栏选项卡和控制器中的表单上传到公共文件夹时。当我想保存它时,在控制器中压缩压缩并保存到公共目录。当我打电话时,文件不被读取。因为Java脚本的路径是公开定义的。这将是重复的数百输出虚拟旅游。但是因为Js文件在公共文件夹中,所以不会在刀片文件中读取它。因为在视图目录中不存在

  • 我有一个经过验证的谷歌客户端,我想列出其他人公用文件夹中的文件(我认为共享或不共享的文件夹是不相关的,因为它是公用的) 这是我在NodeJS中的代码 注意:文档中没有“folderId”选项:https://developers.google.com/drive/api/v3/reference/files/list-只是一个drivid选项 虽然我将corpa设置为“drive”和drive I

  • 问题内容: 我想使用nodejs在src文件夹及其所有子文件夹中找到所有* .html文件。最好的方法是什么? 我认为很多开发人员都应该拥有出色且经过测试的解决方案,使用它比自己编写一个更好。 问题答案: node.js,递归简单函数: 如果想花哨的话,添加RegExp,并添加一个回调使其通用。

  • 本文向大家介绍nodejs分离html文件里面的js和css的方法,包括了nodejs分离html文件里面的js和css的方法的使用技巧和注意事项,需要的朋友参考一下 摘要: 本文要实现的内容,使用nodejs 对文件的增删改查,演示的例子-》分离出一个html 文件里面的script 和style 里面的内容,然后单独生成js文件和css 文件。中间处理异步的api-》async/await ,

  • 我正在尝试传递一个位于我的应用程序的res/raw目录中的图像以及共享意图。 我遵循了FileProvider文档中描述的流程,下面是我的代码: Androidanifest.xml 我的活动中的代码: 由于无法访问我在其他应用程序中获取的文件,因此上述操作无效: java.io.FileNotFoundException:FILE_PATH:打开失败: EACCES(权限拒绝) 知道我做错了什么