Prefacio
El contenido principal de hoy es: imágenes en mensajes Layim, carga y acoplamiento de archivos, monitoreo de estado del usuario y monitoreo de usuarios en línea de agrupación. Lo presentaré uno por uno a continuación.
Carga de imágenes
Hay muchos blogs sobre las cargas de archivos en Spring Boot, y también he extraído parte del código. La parte de carga se introduce brevemente, principalmente introduciendo los problemas encontrados durante el proceso de desarrollo. Primero, echemos un vistazo a la interfaz correspondiente de Layim:
Layim.config ({// Interfaz de imagen de carga, uploadImage: {url: '/upload/file'} // Interfaz de archivo de carga, uploadFile: {url: '/upload/file'} // otro código})Sí, es cierto, podemos implementar la función de enviar imágenes y enviar archivos en Layim escribiendo dos interfaces. Guardaré algunos problemas aquí. Como Layim ha juzgado el tipo de archivo, solo uso una interfaz de carga aquí. El formato devuelto es:
{"código": 0, "msg": "éxito", "datos": {"src": "/upload/d8740baa-cf7e-497c-a085-5c6ed9633f35.gif", "nombre": "8.gif"}}Subir el código es muy simple. Obtenga el sufijo del archivo, genere el nombre GUID y guárdelo en la carpeta correspondiente. Finalmente, devuelva los datos de respuesta que Layim quiere.
Al principio pensé en pasarlo directamente a la carpeta/recursos/static/upload/. Más tarde, descubrí que la ruta de acceso tendrá una situación 404 después de que la carga sea exitosa. La razón es: incluso si hay ese archivo en la carpeta, pero no hay carpeta de destino , por lo que solo se puede recompilar y ejecutar, por lo que definitivamente no funcionará. Entonces busqué una solución. Más tarde, vi una manera de manejarlo, que es asignar cada solicitud de archivo a una ruta en el controlador, y luego usar el resourceloader para encontrar el archivo de respuesta. El código es el siguiente:
/ *** Configuración de ruta para cargar el archivo**/ @Value ("$ {Layim.upload.dir}") String privado FileDirpath; Resourceloader final privado Resourceloader; @AUTOWIRED Public uploadController (ResourCelOader ResourCelOader) {this.resourCeloader = resourceloader; }Obtenga el código de archivo, luego al acceder a ese archivo, especifique el nombre del archivo y el recurso devolverá el recurso correspondiente de acuerdo con la ruta.
/*** Acceda a la ruta del archivo y use ResourCelOaader para obtener el archivo**/@getmapping (valor = "/]filename:.+}") @ResponseBody Public ResponseEntity <?> getFile (@PathVariable String fileName) {try {string ubicación = "archivo:"+ phats.get (fileDirpath, filename) .Tostring (); Recursos recursos = resourceloader.getResource (ubicación); return ResponseEntity.ok (recurso); } capt (excepción e) {return responseEntity.notFound (). Build (); }}Eche un vistazo al efecto: (para encontrar el problema de cargar la limitación del tamaño del archivo al hacer capturas de pantalla de demostración para todos, simplemente cambie la configuración).
http: multipart: tamaño máximo de archivo: 30mb-requisito máximo-tamaño: 30mb
El valor del código anterior se configura como: FileName :.+, de modo que si encontramos un método como /abc.jpg, coincidiremos con el método GetFile. Entonces Resourceloader nos ayuda a encontrar el archivo. Pero para obtener más información, seguí el código fuente. Primero veamos el método GetResource en el DeFaultResourceloader.
@OverridePublic recursos getResource (ubicación de cadena) {afirmo.notnull (ubicación, "ubicación no debe ser null"); for (protocolresolver protocolresolver: this.protocolresolvers) {Resource = ProtocolResolver.Resolver (ubicación, this); if (recurso! if (ubicación.startswith ("/")) {return getResourceByPath (ubicación);} // Esto es para determinar si se ir a classpath: else if (ubicación.startswith (classpath_url_prefix)) {return nuevo classpathResource (ubicación.substring (classpath_url_prefix.length ()), getClaSter (); {try {// Finalmente convierta la dirección del archivo en URL // intente analizar la ubicación como URL ... url url = new Url (ubicación); devuelva la nueva urlResource (url);} catch (malformedurexception ex) {// no url -> resolver como ruta de recursos.Más tarde, durante mi proceso de depuración, descubrí que, por ejemplo, la ruta que accedía fue /abc.gif, luego su fondo se convertiría en esta dirección: archivo: /// g: /javaproject/springbootlayim/upload/abc.gif. De manera similar, también es posible acceder abriendo esta dirección directamente en la máquina. La dirección (archivo: /// ..) anterior es el valor de Layout.upload.dir . Del mismo modo, cambié la carpeta a Resources/Static/Subload/, porque, a través de ResourCelOader, localiza el archivo en la dirección física del servidor.
Ni siquiera hay una carpeta UPLAOD en Target, pero aún se puede acceder a los archivos
Carga de archivo
Utiliza la misma interfaz que la imagen. La diferencia es que cargar archivos grandes requiere cambiar la configuración. Se ha escrito arriba y no se describirá en detalle aquí.
Estado en línea del usuario
En el monitoreo de estado de Layim, existe esto:
// La conmutación del monitor Skylight es Layim.On ('Chatchange', function (res) {console.log (res.data);});De hecho, al leer la lista, el usuario debe cargarse fuera de línea. Sin embargo, aquí hay solo una demostración. Cuando cambia la ventana, verifique el estado del lado opuesto. Entonces, después de activar el evento Chatchange, enviamos una solicitud al servidor.
var t = res.data.type == 'amigo'; Socket.send ({mtype: t? Socket.mtype.checkisonline: Socket.mtype.checkonlinecount, id: res.data.id});Hay dos situaciones arriba. Cuando charleo solo, necesito conocer el estado de la otra parte. El segundo tipo es que durante el chat grupal, quiero saber cuántas personas están en línea. Así que hice una pequeña diferencia.
Agregue dos nuevas clases de procesamiento de mensajes:
De hecho, el código para determinar si está en línea es el siguiente:
ChannelContext checkChannelContext = aio.getChannelContextByUserID (canalContext.getGroupContext (), body.getID ()); // verifique si boolean en línea isonline = checkchannelContext! = Null &&! CheckchannelContext.isClosed ();
Luego encapsule el mensaje al servidor. El proceso de mensaje se ha introducido en la implementación del chat de grupo de chat único, por lo que no entraré en detalles aquí.
Las siguientes son las formas de determinar cuántas personas hay en el grupo:
SetWithlock <ChannelContext> Channellocks = aio.getChannelContextsByGroup (canalContext.getGroupContext (), Body.getID ()); int onlineCount = canalellocks.getObj (). size ();
Mire el efecto, el volumen de datos es un poco pequeño, solo dos usuarios, pero aún es suficiente para una demostración.
Después de iniciar sesión con otra cuenta:
Resumir
Este artículo no es mucho contenido, solo está cargando un archivo y aplicaciones simples de API individuales en TIO. Sin embargo, lo que me emociona es que cuando depurar el código, encontré muchas cosas jugables, como esta cosa:
Por supuesto, el autor ya lo ha introducido en la introducción del marco y puede escuchar el mensaje enviado por cada cliente como estadísticas y otras cosas. Entonces, el siguiente paso es usar estos datos para hacer algo.
Finalmente, dado que el resto es un historial de mensajes simple, preservación de mensajes, aplicación de amigos y otras cosas que agregan, eliminan, modifican y verifican, no lo presentaremos demasiado en el futuro. Publicaré una publicación después de que el proyecto se escriba oficialmente. A continuación, jugaré con los datos en t-io ~~ (espera, ¿te has extraviado? Originalmente estaba aprendiendo springboot ...)
Dirección del código: https://github.com/fanpan26/springbootlayim
Resumir
El anterior es el código de ejemplo para Spring Boot + Layim + T-II para implementar la carga de archivos y monitorear el estado del usuario que el editor le presentó. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!