activeMQ在文件上传的应用

本次试验主要用到了activeMq和上传插件uploadify的知识,感谢以下两篇文章的作者。

1.http://itindex.net/detail/47160-java-jquery-%E4%B8%8A%E4%BC%A0

2.http://blog.csdn.net/jiuqiyuliang/article/details/47160259


本文中不再提供activeMq和uploadify的介绍。



项目结构




web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><display-name>uploadifyDemo</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>upload</servlet-name><servlet-class>com.dao.chu.upload.Upload</servlet-class></servlet><servlet-mapping><servlet-name>upload</servlet-name><url-pattern>/servlet/Upload</url-pattern></servlet-mapping></web-app>


index.jsp


文件中很多注释掉的代码有兴趣可以打开探究uploadify插件。


<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Upload</title><!--装载文件-->
<link href="css/uploadify.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="uploadify/jquery-1.9.1.js"></script>
<script type="text/javascript" src="uploadify/jquery.uploadify.min.js"></script><!--ready事件-->
<script type="text/javascript">$(document).ready(function() {$("#uploadify").uploadify({'uploader' : 'servlet/Upload','swf' : 'uploadify/uploadify.swf','cancelImg' : 'img/uploadify-cancel.png','folder' : 'uploads',//您想将文件保存到的路径'queueID' : 'fileQueue',//与下面的id对应'queueSizeLimit' : 20,'fileDesc' : 'rar文件或zip文件','fileExt' : '*.rar;*.zip', //控制可上传文件的扩展名,启用本项时需同时声明fileDesc'auto' : false,'multi' : true,'simUploadLimit' : 2,'buttonText' : '选择文件','onDialogOpen' : function() {//当选择文件对话框打开时触发/* alert( 'Open!'); */},'onSelect' : function(file) {//当每个文件添加至队列后触发/* alert( 'id: ' + file.id+ ' - 索引: ' + file.index+ ' - 文件名: ' + file.name+ ' - 文件大小: ' + file.size+ ' - 类型: ' + file.type+ ' - 创建日期: ' + file.creationdate+ ' - 修改日期: ' + file.modificationdate+ ' - 文件状态: ' + file.filestatus); */},'onSelectError' : function(file,errorCode,errorMsg) {//当文件选定发生错误时触发alert( 'id: ' + file.id+ ' - 索引: ' + file.index+ ' - 文件名: ' + file.name+ ' - 文件大小: ' + file.size+ ' - 类型: ' + file.type+ ' - 创建日期: ' + file.creationdate+ ' - 修改日期: ' + file.modificationdate+ ' - 文件状态: ' + file.filestatus+ ' - 错误代码: ' + errorCode+ ' - 错误信息: ' + errorMsg);},'onDialogClose' : function(swfuploadifyQueue) {//当文件选择对话框关闭时触发if( swfuploadifyQueue.filesErrored > 0 ){alert( '添加至队列时有'+swfuploadifyQueue.filesErrored+'个文件发生错误n'+'错误信息:'+swfuploadifyQueue.errorMsg+'n选定的文件数:'+swfuploadifyQueue.filesSelected+'n成功添加至队列的文件数:'+swfuploadifyQueue.filesQueued+'n队列中的总文件数量:'+swfuploadifyQueue.queueLength);}},'onQueueComplete' : function(stats) {//当队列中的所有文件全部完成上传时触发/* alert( '成功上传的文件数: ' + stats.successful_uploads+ ' - 上传出错的文件数: ' + stats.upload_errors+ ' - 取消上传的文件数: ' + stats.upload_cancelled+ ' - 出错的文件数' + stats.queue_errors); */},'onUploadComplete' : function(file,swfuploadifyQueue) {//队列中的每个文件上传完成时触发一次/* alert( 'id: ' + file.id+ ' - 索引: ' + file.index+ ' - 文件名: ' + file.name+ ' - 文件大小: ' + file.size+ ' - 类型: ' + file.type+ ' - 创建日期: ' + file.creationdate+ ' - 修改日期: ' + file.modificationdate+ ' - 文件状态: ' + file.filestatus); */},'onUploadError' : function(file,errorCode,errorMsg,errorString,swfuploadifyQueue) {//上传文件出错是触发(每个出错文件触发一次)alert( 'id: ' + file.id+ ' - 索引: ' + file.index+ ' - 文件名: ' + file.name+ ' - 文件大小: ' + file.size+ ' - 类型: ' + file.type+ ' - 创建日期: ' + file.creationdate+ ' - 修改日期: ' + file.modificationdate+ ' - 文件状态: ' + file.filestatus+ ' - 错误代码: ' + errorCode+ ' - 错误描述: ' + errorMsg+ ' - 简要错误描述: ' + errorString);},'onUploadProgress' : function(file,fileBytesLoaded,fileTotalBytes,queueBytesLoaded,swfuploadifyQueueUploadSize) {//上传进度发生变更时触发/* alert( 'id: ' + file.id+ ' - 索引: ' + file.index+ ' - 文件名: ' + file.name+ ' - 文件大小: ' + file.size+ ' - 类型: ' + file.type+ ' - 创建日期: ' + file.creationdate+ ' - 修改日期: ' + file.modificationdate+ ' - 文件状态: ' + file.filestatus+ ' - 当前文件已上传: ' + fileBytesLoaded+ ' - 当前文件大小: ' + fileTotalBytes+ ' - 队列已上传: ' + queueBytesLoaded+ ' - 队列大小: ' + swfuploadifyQueueUploadSize); */},'onUploadStart': function(file) {//上传开始时触发(每个文件触发一次)/* alert( 'id: ' + file.id+ ' - 索引: ' + file.index+ ' - 文件名: ' + file.name+ ' - 文件大小: ' + file.size+ ' - 类型: ' + file.type+ ' - 创建日期: ' + file.creationdate+ ' - 修改日期: ' + file.modificationdate+ ' - 文件状态: ' + file.filestatus ); */},'onUploadSuccess' : function(file,data,response) {//上传完成时触发(每个文件触发一次)/* alert( 'id: ' + file.id+ ' - 索引: ' + file.index+ ' - 文件名: ' + file.name+ ' - 文件大小: ' + file.size+ ' - 类型: ' + file.type+ ' - 创建日期: ' + file.creationdate+ ' - 修改日期: ' + file.modificationdate+ ' - 文件状态: ' + file.filestatus+ ' - 服务器端消息: ' + data+ ' - 是否上传成功: ' + response); */}});});
</script>
</head><body><div id="fileQueue"></div><input type="file" name="uploadify" id="uploadify" /><p><!-- 上传第一个未上传的文件 --><a href="javascript:$('#uploadify').uploadify('upload')">上传</a><!-- 取消第一个未取消的文件 --><a href="javascript:$('#uploadify').uploadify('cancel')">取消上传</a><a href="javascript:$('#uploadify').uploadify('upload','*')">上传所有文件</a> <a href="javascript:$('#uploadify').uploadify('cancel','*')">取消所有上传</a></p>
</body>
</html>


FileVo.java


这里封装了文件的一些信息。


package com.dao.chu.orm;import java.io.Serializable;public class FileVo implements Serializable
{/*** serialVersionUID*/private static final long serialVersionUID = 1L;//保存的包路径private String savePath;//保存全路径private String filePath;//原文件名private String oldFileName;//新文件名private String newFileName;//文件大小private String fileSize;//扩展名private String extName;public String getSavePath(){return savePath;}public void setSavePath(String savePath){this.savePath = savePath;}public String getFilePath(){return filePath;}public void setFilePath(String filePath){this.filePath = filePath;}public String getOldFileName(){return oldFileName;}public void setOldFileName(String oldFileName){this.oldFileName = oldFileName;}public String getNewFileName(){return newFileName;}public void setNewFileName(String newFileName){this.newFileName = newFileName;}public String getFileSize(){return fileSize;}public void setFileSize(String fileSize){this.fileSize = fileSize;}public String getExtName(){return extName;}public void setExtName(String extName){this.extName = extName;}@Overridepublic String toString(){return "FileVo [savePath=" + savePath + ", filePath=" + filePath + ", oldFileName=" + oldFileName+ ", newFileName=" + newFileName + ", fileSize=" + fileSize + ", extName=" + extName + "]";}public FileVo(String savePath, String filePath, String oldFileName, String newFileName, String fileSize,String extName){super();this.savePath = savePath;this.filePath = filePath;this.oldFileName = oldFileName;this.newFileName = newFileName;this.fileSize = fileSize;this.extName = extName;}}


Upload.java

package com.dao.chu.upload;import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import com.dao.chu.orm.FileVo;
import com.dao.chu.util.MqProducer;@SuppressWarnings("serial")
public class Upload extends HttpServlet
{@SuppressWarnings("unchecked")public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{String savePath = this.getServletConfig().getServletContext().getRealPath("");savePath = savePath + "/uploads/";File f1 = new File(savePath);System.out.println(savePath);if (!f1.exists()){f1.mkdirs();}DiskFileItemFactory fac = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(fac);upload.setHeaderEncoding("utf-8");List fileList = null;try{fileList = upload.parseRequest(request);}catch (FileUploadException ex){return;}Iterator<FileItem> it = fileList.iterator();String oldFileName = "";String newFileName = "";String extName = "";while (it.hasNext()){FileItem item = it.next();if (!item.isFormField()){oldFileName = item.getName();long size = item.getSize();String type = item.getContentType();System.out.println(size + " " + type);if (oldFileName == null || oldFileName.trim().equals("")){continue;}// 扩展名格式:if (oldFileName.lastIndexOf(".") >= 0){extName = oldFileName.substring(oldFileName.lastIndexOf("."));}File file = null;do{// 生成文件名:newFileName = UUID.randomUUID().toString();file = new File(savePath + newFileName + extName);} while (file.exists());File saveFile = new File(savePath + newFileName + extName);try{item.write(saveFile);Map<String, String> map = setFileVo(savePath, savePath, oldFileName, newFileName, String.valueOf(size), extName);//MQ发送消息MqProducer.sendMessage(map);}catch (Exception e){e.printStackTrace();}}}response.getWriter().print(newFileName + extName);}@SuppressWarnings("unused")private Map<String, String> setFileVo(String savePath, String filePath, String oldFileName, String newFileName, String fileSize,String extName){FileVo fileVo = new FileVo(savePath, filePath, oldFileName, newFileName, fileSize, extName);Map<String, String> map = mapPutFileVo(fileVo);return map;}private Map<String, String> mapPutFileVo(FileVo fileVo){Map<String, String> map = new HashMap<String,String>();map.put("savePath", fileVo.getSavePath());map.put("filePath", fileVo.getFilePath());map.put("newFileName", fileVo.getNewFileName());map.put("oldFileName", fileVo.getOldFileName());map.put("extName", fileVo.getExtName());map.put("fileSize", fileVo.getFileSize());return map;}
}


MqProducer.java


注意此处将每次发送的消息设为10条,也就是上传一个文件发送十条消息。一般只设为1即可。


package com.dao.chu.util;import java.util.Map;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;/*** * MQ生产者,发送消息* @see  [相关类/方法]* @since  [产品/模块版本]*/
public class MqProducer
{// 默认连接用户名private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;// 默认连接密码private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;// 默认连接地址private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;// 发送的消息数量private static final int SENDNUM = 10;/*** * 发送消息,外部调用方法* * @see [类、类#方法、类#成员]*/public static void sendMessage(Map<String, String> map){// 连接工厂ConnectionFactory connectionFactory;// 连接Connection connection = null;// 会话 接受或者发送消息的线程Session session;// 消息的目的地Destination destination;// 消息生产者MessageProducer messageProducer;// 实例化连接工厂connectionFactory =new ActiveMQConnectionFactory(MqProducer.USERNAME, MqProducer.PASSWORD, MqProducer.BROKEURL);try{// 通过连接工厂获取连接connection = connectionFactory.createConnection();// 启动连接connection.start();// 创建sessionsession = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);// 创建一个名称为NewFileList的消息队列destination = session.createQueue("NewFileList");// 创建消息生产者messageProducer = session.createProducer(destination);// 发送消息send(session, messageProducer,map);session.commit();}catch (Exception e){e.printStackTrace();}finally{if (connection != null){try{connection.close();}catch (JMSException e){e.printStackTrace();}}}}/*** 发送消息,内部方法* * @param session* @param messageProducer 消息生产者* @throws Exception*/public static void send(Session session, MessageProducer messageProducer,Map<String, String> map)throws Exception{for (int i = 0; i < MqProducer.SENDNUM; i++){MapMessage message = session.createMapMessage();message.setObject("map", map);System.out.println("发送消息:Activemq 发送消息" + map.toString());// 通过消息生产者发出消息messageProducer.send(message);}}}


运行效果


主页



选择文件并点击上传所有文件




控制台共打印出50条消息





打开本地的mq,看队列

可看到共有50条消息。








点击NewFileList并点击某个消息







可看到具体发送的消息,里面我们封装了文件名称,文件大小,文件路径等。这样我们就可以实时监控文件上传情况。






源码下载

转载于:https://www.cnblogs.com/tongrui/p/6376251.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谢烟客---------Linux之DNS服务系统的基础知识

DNS Domain Name Server1)C/S架构&#xff1a;SOCKET通信IP PORT2&#xff09;应用层协议&#xff1a;资源子网BIND Berkerley Information Name DomainDNS由来1&#xff09;统一名字&#xff0c;自己维护 <自己查询>解析: 基于key查找value: 查询数据库(二维关系的表: …

ES6对象的扩展

1.属性简写表示 2.方法简写表示 属性与方法简写&#xff1a; 3.属性名表达式 ES6允许字面量定义对象时&#xff0c;用方法二&#xff08;表达式&#xff09;作为对象的属性名&#xff0c;即把表达式放在方括号内。 4.Object.is()比较两个值是否严格相等 转载于:https://www.cnb…

Spring Cloud项目MVN编译 -- Non-resolvable import POM

最近利用闲余时间&#xff0c;打算搭建一套基于Spring Cloud G版的微服务架构(Spring boot 2.1.0)&#xff0c;一顿操作之后,IDEA也没有提示什么错误,自认为微服务搭建完毕。启动项目前&#xff0c;习惯性的Maven -clean了一下&#xff0c;我去&#xff0c;IDEA里面的Maven Pro…

mysql windows身份验证_SQL Server 2005 怎么就不能用Windows身份验证方式登录呢?

SQL Server 2005 自从装到我的电脑上始终无法使用Windows身份验证的方式登录,由于使用用户名和密码登录还算顺畅,所以一直忽略了这SQL Server 2005 自从装到我的电脑上始终无法使用Windows身份验证的方式登录,由于使用用户名和密码登录还算顺畅,所以一直忽略了这个问题,直到又有…

NOIP2011 铺地毯

题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯&#xff0c;一共有n张地毯&#xff0c;编号从 1 到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设&…

安全专家教你如何利用Uber系统漏洞无限制的免费乘坐?

本文讲的是安全专家教你如何利用Uber系统漏洞无限制的免费乘坐&#xff1f;&#xff0c;近日&#xff0c;根据外媒报道&#xff0c;美国一名安全研究人员发现Uber上存在一处安全漏洞&#xff0c;允许发现这一漏洞的任何用户在全球范围内免费享受Uber乘车服务。据悉&#xff0c;…

java中同步组件_Java并发编程(自定义同步组件)

并发包结构图&#xff1a;编写一个自定义同步组件来加深对同步器的理解业务要求&#xff1a;* 编写一个自定义同步组件来加深对同步器的理解。* 设计一个同步工具&#xff1a;该工具在同一时刻&#xff0c;只允许至多两个线程同时访问&#xff0c;超过两个线程的* 访问将被阻塞…

算法之旅 | 快速排序法

HTML5学堂-码匠&#xff1a;前几期“算法之旅”跟大家分享了冒泡排序法和选择排序法&#xff0c;它们都属于时间复杂度为O(n^2)的“慢”排序。今天跟大家分享多种排序算法里使用较广泛&#xff0c;速度快的排序算法—— 快速排序法 [ 平均时间复杂度为O (n logn) ]。Tips 1&…

springmvd接收参数问题

问题描述&#xff1a; 好久不写博客了&#xff0c;今天遇到一个问题&#xff0c;那就是post请求时&#xff0c;参数接收不到&#xff0c;当时我很纳闷&#xff0c;看代码&#xff1a; 就是这样几个参数&#xff0c;我使用postman请求时无法获取参数&#xff1a; 报错信息&#…

OpenGL中的二维编程——从简单的矩形开始

一、OpenGL的组成 图元函数&#xff08;primitive function&#xff09;指定要生成屏幕图像的图元。包括两种类型&#xff1a;可以在二维、三维或者四维空间进行定义的几何图元&#xff0c;如多边形&#xff1b;离散实体&#xff1b;位图。属性函数&#xff08;attribute funct…

第38天:运算符、字符串对象常用方法

一、运算符 一元操作符 &#xff0c; --&#xff0c; &#xff0c; - 5 -6 逻辑操作符 !&#xff0c; &&&#xff0c; || 基本运算符 , -, *, /, % 关系操作符 >, <, >, <, , , !, ! 赋值 判断 全等 条件操作符 &#xff08;三…

Redux Todos Example

此项目模板是使用Create React App构建的&#xff0c;它提供了一种简单的方法来启动React项目而无需构建配置。 使用Create-React-App构建的项目包括对ES6语法的支持&#xff0c;以及几种非官方/尚未最终形式的Javascript语法 先看效果 这个例子可以帮助你深入理解在 Redux 中 …

python实现软件的注册功能(机器码+注册码机制)

sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 一、前言&#xff1a;目的&#xff1a;完成已有python图像处理工具的注册功能功能&am…

Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

原文:Win10 UWP开发系列&#xff1a;使用VS2015 Update2ionic开发第一个Cordova App安装VS2015 Update2的过程是非常曲折的。还好经过不懈的努力&#xff0c;终于折腾成功了。 如果开发Cordova项目的话&#xff0c;推荐大家用一下ionic这个框架&#xff0c;效果还不错。对于Cor…

[Swift]LeetCode1035.不相交的线 | Uncrossed Lines

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

php sql语句过滤,php如何做sql过滤

php如何做sql过滤SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序&#xff0c;而这些输入大都是SQL语法里的一些组合&#xff0c;通过执行SQL语句进而执行攻击者所要的操作&#xff0c;其主要原因是程序没有细致地过滤用户输入的数据&#xff0c;致使非法数据侵入…

Oracle Sql 胡乱记

/Oracle查询优化改写/ --1、coalesce 返回多个值中&#xff0c;第一个不为空的值 select coalesce(, , s) from dual; --2、order by -----dbms_random.value 生产随机数,利用随机数对查询结果进行随机排序 select * from emp order by dbms_random.value; --指定查询结果中的一…

Object Pools 喷泉效果实现

摘录自&#xff1a;http://catlikecoding.com/unity/tutorials/object-pools/ 工程 效果图 工程里面有响应的注释 源码我就不单独放出来了

本地模式运行spark streaming程序(win7安装nc命令通信)

2019独角兽企业重金招聘Python工程师标准>>> 首先在win7上安装nc命令 下载nc程序包&#xff0c;放在c盘目录下&#xff0c;cmd打开命令行&#xff0c;进入nc目录&#xff0c;执行&#xff1a;nc -l -L -p 8888开始监控。再打开一个命令行窗口进入nc目录&#xff0c;…

如何用js获取浏览器URL中查询字符串的参数

首先要知道Location这个对象以及这个对象中的一些属性&#xff1a; href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主机名和当前的URL的端口号。本博客首页返回www.cnblogs.com hostname:设置或返回当前URL的主机名。本博客首页返…