Nginx 战斗准备 —— 优化指南

大多数的Nginx安装指南告诉你如下基础知识——通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了!而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能很好地工作了。然而,如果你真的想挤压出nginx的性能,你必须更深入一些。在本指南中,我将解释Nginx的那些设置可以微调,以优化处理大量客户端时的性能。需要注意一点,这不是一个全面的微调指南。这是一个简单的预览——那些可以通过微调来提高性能设置的概述。你的情况可能不同。 基本的 (优化过的)配置 我们将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置。你应该能够在服务器的/etc/nginx目录中找到nginx.conf。首先,我们将谈论一些全局设置,然后按文件中的模块挨个来,谈一下哪些设置能够让你在大量客户端访问时拥有良好的性能,为什么它们会提高性能。本文的结尾有一个完整的配置文件。 高层的配置 nginx.conf文件中,Nginx中有少数的几个高级配置在模块部分之上。 1 user www-data; 2 pid /var/run/nginx.pid; 3 4 worker_processes auto; 5 6 worker_rlimit_nofile 100000; user和pid应该按默认设置 – 我们不会更改这些内容,因为更改与否没有什么不同。 worker_processes 定义了nginx对外提供web服务时的worder进程数。最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)。 worker_rlimit_nofile 更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。 Events模块 events模块中包含nginx中所有处理连接的设置。 1 events { 2     worker_connections 2048; 3     multi_accept on; 4     use epoll; 5 } worker_connections设置可由一个worker进程同时打开的最大连接数。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高。 记住,最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。 multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。 use 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。想知道更多有关事件轮询?看下维基百科吧(注意,想了解一切的话可能需要neckbeard和操作系统的课程基础) (值得注意的是如果你不知道Nginx该使用哪种轮询方法的话,它会选择一个最适合你操作系统的) HTTP 模块 HTTP模块控制着nginx http处理的所有核心特性。因为这里只有很少的配置,所以我们只节选配置的一小部分。所有这些设置都应该在http模块中,甚至你不会特别的注意到这段设置。 01 http { 02 03     server_tokens off; 04 05     sendfile on; 06 07     tcp_nopush on; 08     tcp_nodelay on; 09 10     … 11 } server_tokens 并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。sendfile可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile) tcp_nopush 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送 tcp_nodelay 告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。 1 access_log off; 2 error_log […]

龙生   23 Nov 2013
View Details

最危险的开源项目——比特币

一时间,关于比特币的信息充斥着互联网的各个角落,11月19日上午,比特币的价格又如同做了次过山车,最高触及900美元的高价,然后在30分钟内跌到 了650美元,但这仍然比18日的最高价569美元上涨了不少。而去年11月中旬,比特币的价格还在11美元,1年之内最高涨幅竟然达到了90倍。 什么是比特币 我们先来了解一下比特币是什么东西。比特币英文名称为Bitcoin,简写为BTC,货币符号为฿,这是一种虚拟的加密电子货币,可以由开源的P2P软件产生(俗称“挖矿”)。 比特币的概念最初由中本聪(Satoshi Nakamoto,化名,真实身份未知)在2008年提出。随后,他以开放、对等、共识、直接参与的理念为基准,结合开源软件和密码学中块密码的工作模 式,在P2P对等网络和分布式数据库的平台上,开发出比特币发行、交易和账户管理的操作系统。该系统让遍布整个对等网络用户端的各节点,按照其种子文件达 成网络协议,从而确保在货币发行、管理、流通等环节中公平、安全、可靠。2009年1月3日,首批50个比特币问世。 比特币项目的源码也托管在了Github上,链接:https://github.com/bitcoin/bitcoin/,目前这一项目由比特币基金会维护。 比特币与传统电子货币的差异 比特币是一种新型的电子货币,与传统电子货币相比,它具有如下特性: 去中心化:比特币是一种分布式的虚拟货币,整个网络由用户构成,没有中央银行。 全世界流通:比特币可以在任意一台接入互联网的电脑上管理,不管身处何方,任何人都可以挖掘、购买、出售或收取比特币。 数量有限:其总数量非常有限,具有极强的稀缺性。该货币系统要求在4年内只有不超过1050万个,之后的总数量将被永久限制在2100万个。 专属所有权:操控比特币需要私钥,它可以被隔离保存在任何存储介质。除了用户自己之外无人可以获取。 匿名账户:比特币的账户是匿名的。但是因为交易历史是完全公开的,投入足够的人力和时间,通过交易链原则上可以追溯到实名用户。 开源:比特币的代码是开放的,而传统电子货币都是封闭的。商家、消费者、投资者和服务商,能够围绕这套开源体系创建起非常丰富的服务和金融体系。 比特币有什么用? 比特币可以用来兑现,可以兑换成大多数国家的货币。使用者可以用比特币购买一些虚拟物品,比如网络游戏当中的衣服、帽子、装备等,只要有人接受,也可以使用比特币购买现实生活当中的物品。 近日,科普网站果壳网宣布其在线销售的智能手表支持比特币付款、百度旗下提供网络安全服务的网站加速乐也支持比特币结算,盛大网络旗下的地产开发商盛旅置业甚至在上海推出了支持比特币购买的楼盘。 除部分国家对虚拟货币有明文规定外,还没有任何国家对比特币的发行作出法律的规范和保障。由于比特币账户是匿名的,所以也可能会被用于非法的黑市交易,比如购买枪 支、毒 品、走 私等。 目前更多的比特币持有者将比特币作为一种投资产品。 比特币价格为什么会疯长? 为什么比特币的价格能够在短时间内上涨这么多?比特币更像是股票,但不同的是,它没有一个正规的监管机构来控制。以下仅是对比特币价格疯狂波动的一些猜测。 1. 总数量限制 比特币是由对等网络P2P的节点在完成一个特定数学问题计算之后生产出的。这些数学计算需要相当的运算能力才能完成,并能够通过生成有效运算工作 的证明来检验。在最初的四年里会有1050万个比特币被制造出来,这个数值每4年减半,所以在第4到第8年中会有525万个比特币被制造,在第8到第12 年中会生产262.5万个比特币,以此类推。因此最终比特币的总数量会无限趋近于2100万。 由于资源稀缺,参与人数众多,导致比特币的“挖掘”工作越来越难,从而抬升了价格。 2. 中国区交易的推动 比特币价格疯涨的其中一个说法是,大量中国投资者的进场,抬升了其价格。 目前中国已经成为比特币交易的最大市场,2013年10月底,中国比特币的市场份额已经占全球的50%,每天交易量为10万个,已超越美国成为全球最大的比特币市场。 下图来自Fiatleak.com,显示了比特币的动态交易现状。图中显示的时段中,有大量的比特币交易来自中国,几乎是其他国家投资量总和的2倍。 3. 人们对比特币增值的信心 比特币的价值和增长空间在于未来有多少人、多少商品和服务愿意接受比特币的付款,目前拥有比特币的人数仅有数十万人,增长空间巨大,也有越来越多 的商家开始接受比特币支付。再加上一些国家政府也开始干预(19日美国参议院首次关于比特币召开听证会),因此人们对于比特币的升值空间有了更大的信心。 4. 幕后庄家 比特币交易与股市相比,有更高的风险,因为它没有涨跌停限制,同时交易是24小时开放的,由于筹码较少,比特币的价格易受到庄家控制,有可能出现一天价格涨几倍的情况,同时也可能出现一天内价格跌去一半的情况。 比特币的安全隐患 所谓“树大招风”,高投资回报的背后往往意味着高风险。由于没有一个监管机构,导致比特币疯长的同时也带来了一系列安全隐患,比如: 2011年6月19日,Mt.Gox比特币交易中心的安全漏洞导致1比特币价格一度跌至1美分。原因是一个黑客从感染木马的电脑上盗用了该用户MtGox的证书,从而把比特币转到自己的帐号上并抛售,产生了大量该价格的“ask”请求。 2011年7月,世界第三大比特币交易中心Bitomat的运营商宣布:记录着17,000比特币(约合22万美元)的wallet.dat文件的访问权限丢失。同时宣布决定出售服务以弥补用户损失。 2011年8月,作为常用比特币交易的处理中心之一的MyBitcoin宣布遭到黑客攻击,并导致关机。涉及客户存款的49%,超过78000比特币(当时约相当于80万美元)下落不明。 2012年,Bitcoinica两度遭到黑客攻击,被指控忽略客户资金的安全性以及伪造提款申请。 2012年8月下旬,Bitcoin Savings and Trust被所有者关闭,并留下据称约560万美元的债务。 2012年9月,Bitfloor交易中心被黑客入侵,24,000比特币(约相当于25万美元)被盗。 2013年5月24日,比特人网站btcman创建的比特海网站被所谓的黑客入侵,约40个比特币被盗。 2013年10月底,注册地位于香港的GBL比特币交易平台下线,卷走用户持有的价值410万美元的比特币。 2013年11月,网络钱包服务商inputs.io被两个黑客入侵,盗走4100比特币。 未来的预测 就像谁也没有预测到比特币能火到今天这种地步,也没有人能预知未来的发展。不过可能会存在以下几种情况。 1.  价格趋于理智,成为合法货币 货币的价值取决于供需关系,而目前比特币还处于初级发展阶段,供需关系还不明朗,随着技术和经济的发展,未来比特币或有可能成为一种成熟的货币,在市场上更广泛地流通。届时其价格也将趋于合理、稳定。 当然这是一个理想的结果,但是如果没有一个正规的全球性监管机构,这个结果基本上无法实现。 2.  触及经济、社会安全,政府介入 由于比特币是全球性的,没有一个国家能够监管,这势必对现有的金融体系构成威胁。届时政府也许会出台相应的措施来进行调控。 目前比特币更多是用来投资,但是在支付方面,由于其匿名性,可能被用来进行非法交易、洗钱等,进而触及社会安全,这也是需要政府监管的原因之一。 3.  泡沫破碎 比特币价格的飙升其中一个原因是参与的用户越来越多,如果用户量减少,其价格也将下跌。如果真如上面所说的有幕后庄家,这一泡沫终将破碎,最后买单的还是散户。 因此,也有人预测比特币最终将会变成一场庞氏骗局和泡沫经济。 4.  被更成熟的虚拟货币代替 英国《经济学人》杂志曾表示,对比特币最大的威胁是竞争。该杂志表示,由于本身的缺陷和新的虚拟货币的替代,比特币货币体系最终可能无法维持甚至陷入崩溃,但它仍将为整个金融行业留下不朽的遗产,推动新的数字货币的发展。 最后 目前一些国家也在出台比特币相关的规范,2013年8月,德国政府认可比特币作为一个记账单位,10月29日,世界首台比特币自动提款机也已在加拿大启用,可办理加拿大元与比特币的兑换。 尽管比特币的产生、交易、支付都非常自由,但是如果没有了合法机构的监管以及相关法律法规的约束,这种自由则意味着更大的风险。 Bitcoin 的详细介绍:请点这里 Bitcoin 的下载地址:请点这里 想通过手机客户端访问开源中国:请点这里 转自:http://www.oschina.net/news/46099/the-most-dangerous-opensource-bitcoin

龙生   23 Nov 2013
View Details

nginx 安全漏洞 (CVE-2013-4547)

这是来自 Nginx 邮件列表的内容: Nginx 的安全限制可能会被某些请求给忽略,(CVE-2013-4547). 当我们通过例如下列方式进行 URL 访问限制的时候,如果攻击者使用一些没经过转义的空格字符(无效的 HTTP 协议,但从 Nginx 0.8.41 开始因为考虑兼容性的问题予以支持)那么这个限制可能无效: 1 location /protected/ { 2         deny all; 3     } 当请求的是 "/foo /../protected/file" 这样的 URL (静态文件,但 foo 后面有一个空格结尾) 或者是如下的配置: 1 location ~ \.php$ { 2         fastcgi_pass … 3     } 当我们请求 "/file \0.php" 时就会绕过限制。 该问题影响 nginx 0.8.41 – 1.5.6. 该问题已经在 Nginx 1.5.7 和 1.4.4 版本中修复。 补丁程序在: http://nginx.org/download/patch.2013.space.txt 配置上临时的解决办法是: 1 if ($request_uri ~ " ") { 2         return 444; 3     } 转自:http://www.oschina.net/question/12_133891

龙生   23 Nov 2013
View Details

JS版的个税计算器

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>个税计算器</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <style> .descBlock { margin: 0 auto; width: 550px; display: none; } .descBlock_on { margin: 0 auto; width: 550px; } .descTitle { color: #FF0000; font-size: 18px; text-align: center; line-height: 120%; } .descContent { line-height: 150%; } </style> <script language="javascript"> //工资、薪金所得 OK 2000 function calcTax1(income) { var tax; var diff = (income – 2000); if (diff <= 0) { tax = 0; } if (diff > 0 && diff <= 500) { […]

龙生   22 Nov 2013
View Details

Eclipse 3.7 / Indigo / PDT 3.0

From Update Site Prerequisites Installed and running Eclipse Classic 3.7 The minimum package is Eclipse Platform Runtime Binary. It is available at here Any packages in Eclipse Downloads page are available also. Installation Flow Open Help -> Install New Software. Select the Indigo update site. When the list of existing features is populated – select 'PHP Development Tools'. Make sure 'Contact all update sites…' is checked. Proceed with the installation by pressing 'Next', then press 'Next' again in the next screen. Accept the EULA when asked: Finish the […]

龙生   21 Nov 2013
View Details

android虚拟机如何安装应用程序

1、搭建好android开发环境 2、启动android虚拟机(Eclipse下启动也可) 3、Windows系统打开cmd,进入android-sdk-windows\platform-tools目录 4、输入 adb install xxx.apk ;注意cmd下安装时不要使用中文,避免发生错误 5、刷新android虚拟机桌面,测试该应用程序   在android虚拟机中安装文件管理器后,即可进入文件管理操作; 在电脑上下载安装包 xxx.apk 后安装该软件到android虚拟机中,再借助文件管理器进行更简便的安装操作 转自:http://wu110cheng.blog.163.com/blog/static/133349654201232242429902/

龙生   20 Nov 2013
View Details

为 Web 设计师准备的 25+ 款扁平 UI 工具包

Flat UI Kit by Riki Tanone (free)   Flat UI Kit (PSD) by Devin Schulz (free)   Eerste UI Kit (free)   Metro UI kit (free)   Ui Kit by Abhimanyu Rana (free)   Flat Ui Kit by Zachary VanDeHey (free)   FREE flat UI kit by Visualcreative.cz (free)   UI Kit (PSD) by Piotr Kwiatkowski (free)   Vertical Infinity (free)   Flat/UI Kit by Sebastiaan Scheer (free)   Flat UI Kit by Jan Dvorak (free)   Flat Design UI Concepts (free)   UI/UX Kit (free)   Flat Bold UI Kit by Simon Eramo (free)   UI Kit by Huseyin Yilmaz (free) […]

龙生   20 Nov 2013
View Details

使用 WebSockets 的 9 个应用场景

WebSockets支持及时数据交换,并被所有现代浏览器支持。请直接在你的web apps上使用它吧。 至所有我的读者:幸运的是我目前在巴西进行Scaling systems项目,享受32度的气温,吃着咸八宝饭还有凯匹林纳鸡尾酒。同时根据你们的要求更新着博客,我邀请了我主要的成员侨纳琛弗里曼在我离开的时间指导你们。 没有其他技术能够像WebSocket一样提供真正的双向通信,许多web开发者仍然是依赖于ajax的长轮询来实现。(注:我认为长轮询是富于创造性和多功能性的,虽然这只是一个不太完美的解决办法(hack))对Websocket缺少热情,也许是因为多年前他的安全性的脆弱,抑或者是缺少浏览器的支持,不管怎样,这两个问题都已经被解决了。 决定手头的工作是否需要使用WebSocket技术的方法很简单: 你的应用提供多个用户相互交流吗? 你的应用是展示服务器端经常变动的数据吗? 如果你的回答是肯定的,那么请考虑使用WebSocket。如果你仍然不确定,并想要更多的灵感,这有一些杀手锏的案例。 1.社交订阅 对社交类的应用的一个裨益之处就是能够即时的知道你的朋友正在做什么。虽然听起来有点可怕,但是我们都喜欢这样做。你不会想要在数分钟之后才能知道一个家庭成员在馅饼制作大赛获胜或者一个朋友订婚的消息。你是在线的,所以你的订阅的更新应该是实时的。 2.多玩家游戏 网络正在迅速转变为游戏平台。在不使用插件(我指的是Flash)的情况下,网络开发者现在可以在浏览器中实现和体验高性能的游戏。无论你是在处理DOM元素、CSS动画,HTML5的canvas或者尝试使用WebGL,玩家之间的互动效率是至关重要的。我不想在我扣动扳机之后,我的对手却已经移动位置。 3.协同编辑/编程 我们生活在分布式开发团队的时代。平时使用一个文档的副本就满足工作需求了,但是你最终需要有一个方式来合并所有的编辑副本。版本控制系统,比如Git能够帮助处理某些文件,但是当Git发现一个它不能解决的冲突时,你仍然需要去跟踪人们的修改历史。通过一个协同解决方案,比如WebSocket,我们能够工作在同一个文档,从而省去所有的合并版本。这样会很容易看出谁在编辑什么或者你在和谁同时在修改文档的同一部分。 4.点击流数据 分析用户与你网站的互动是提升你的网站的关键。HTTP的开销让我们只能优先考虑和收集最重要的数据部分。然后,经过六个月的线下分析,我们意识到我们应该收集一个不同的判断标准——一个看起来不是那么重要但是现在却影响了一个关键的决定。与HTTP请求的开销方式相比,使用Websocket,你可以由客户端发送不受限制的数据。想要在除页面加载之外跟踪鼠标的移动?只需要通过WebSocket连接发送这些数据到服务器,并存储在你喜欢的NoSQL数据库中就可以了(MongoDB是适合记录这样的事件的)。现在你可以通过回放用户在页面的动作来清楚的知道发生了什么。 5.股票基金报价 金融界瞬息万变——几乎是每毫秒都在变化。我们人类的大脑不能持续以那样的速度处理那么多的数据,所以我们写了一些算法来帮我们处理这些事情。虽然你不一定是在处理高频的交易,但是,过时的信息也只能导致损失。当你有一个显示盘来跟踪你感兴趣的公司时,你肯定想要随时知道他们的价值,而不是10秒前的数据。使用WebSocket可以流式更新这些数据变化而不需要等待。 6.体育实况更新 现在我们开始讨论一个让人们激情澎湃的愚蠢的东西——体育。我不是运动爱好者,但是我知道运动迷们想要什么。当爱国者在打比赛的时候,我的妹夫将会沉浸于这场比赛中而不能自拔。那是一种疯狂痴迷的状态,完全发自内心的。我虽然不理解这个,但是我敬佩他们与运动之间的这种强烈的联系,所以,最后我能做的就是给他的体验中降低延迟。如果你在你的网站应用中包含了体育新闻,WebSocket能够助力你的用户获得实时的更新。 7.多媒体聊天视频会议并不能代替和真人相见,但当你不能在同一个屋子里见到你谈话的对象时,视频会议是个不错的选择。尽管视频会议私有化做的“不错”,但其使用还是很繁琐。我可是开放式网络的粉丝,所以用WebSockets getUserMedia API和HTML5音视频元素明显是个不错的选择。WebRTC的出现顺理成章的成为我刚才概括的组合体,它看起来很有希望,但其缺乏目前浏览器的支持,所以就取消了它成为候选人的资格。 8.基于位置的应用越来越多的开发者借用移动设备的GPS功能来实现他们基于位置的网络应用。如果你一直记录用户的位置(比如运行应用来记录运动轨迹),你可以收集到更加细致化的数据。如果你想实时的更新网络数据仪表盘(可以说是一个监视运动员的教练),HTTP协议显得有些笨拙。借用WebSocket TCP链接可以让数据飞起来。 9.在线教育上学花费越来越贵了,但互联网变得更快和更便宜。在线教育是学习的不错方式,尤其是你可以和老师以及其他同学一起交流。很自然,WebSockets是个不错的选择,可以多媒体聊天、文字聊天以及其它优势如与别人合作一起在公共数字黑板上画画… 转自:http://www.oschina.net/translate/9-killer-uses-for-websockets

龙生   20 Nov 2013
View Details

解决SQLServer中变更海量数据表结构时产生【无法修改表. Timeout 时间已到. 在操作完成之前超时时间已过或服务器未响应. 】

【解决办法】:  工具->选项>设计器->表设计器和数据库设计器->右侧勾选“为表设计器更新重写连接字符串的超时值”,在它下面的“事务超时时间”默认应该是 30 秒,改得稍微大一些,不过好像不能超过65535. 转自:http://blog.csdn.net/abandonship/article/details/8516541

龙生   18 Nov 2013
View Details

ASP.NET实现二维码(QRCode)的创建和读取

QR二维码比其他二维码相比,具有识读速度快、数据密度大、占用空间小的优势。QR码的三个角上有三个寻象图形,使用CCD识读设备来探测码的位置、大小、倾斜角度、并加以解码,实现360度高速识读。每秒可以识读30个含有100个字符QR码。QR码容量密度 大,可以放入1817个汉字、7089个数字、4200个英文字母。QR码用数据压缩方式表示汉字,仅用13bit即可表示一个汉字,比其他二维条码表示汉字的效率提高了20%。QR具有4个等级的纠错功能,即使破损也能够正确识读。QR码抗弯曲的性能强,通过QR码中的每隔一定的间隔配置有校正图形,从码的外形来求得推测校正图形中心点与实际校正图形中心点的误差来修正各个模快的中心距离,即使将QR码贴在弯曲的物品上也能够快速识读。QR码可以分割成16个QR码,可以一次性识读数个分割码,适应于印刷面积有限及细长空间印刷的需要。此外微型QR码可以在1厘米的空间内放入35个数字或9个汉字或21个英文字母,适合对小型电路板对ID号码进行采集的需要。(From:http://tuqiang9999.blog.163.com/blog/static/33241320111115103159542/) QRCode下载地址:ThoughtWorks.QRCode(支持中文)   一、项目引用QRCode的DLL文件(ThoughtWorks.QRCode.dll) 二、ASPX页面(两个jquery的js文件请自行去官网下载): <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server">     <title>二维码工具测试</title>     <script type="text/javascript" src="../../Scripts/Jquery/jquery-1.6.2.js"></script>     <script type="text/javascript" src="../../Scripts/Jquery/jquery.form.js"></script>     <script type="text/javascript" src="js/test.js"></script>     <style type="text/css">         .style1         {             width: 100%;         }         #txt_qr         {             width: 632px;         }     </style> </head> <body>     <div>         <table class="style1">             <tr>                 <td>                     输入文字:                 </td>                 <td>                     <input type="text" id="txt_qr" name="txt_qr" />                 </td>             </tr>             <tr>                 <td>                     二维码图片                 </td>                 <td>                     <img id="qrimg" alt="二维码图片" />                 </td>             </tr>             <tr>                 <td>                     生成选项                 </td>                 <td>                     Encoding:<select id="Encoding">                         <option value="Byte">Byte</option>                         <option value="AlphaNumeric">AlphaNumeric</option>                         <option value="Numeric">Numeric</option>                     </select>                     Correction Level:<select id="Level">                         <option value="M">M</option>                         <option value="L">L</option>                         <option value="Q">Q</option>                         <option value="H">H</option>                     </select>                     Version:<input id="txt_ver" type="text" value="7" />(1-40) Size:<input id="txt_size"                         type="text" value="4" />                 </td>             </tr>             <tr>                 <td colspan="4">                     <input type="button" onclick="getQrImg();" value="生成二维码" />                 </td>             </tr>             <tr>                 <td>                     <form id="qrForm" action="Ashx/test.ashx" method="post" enctype="multipart/form-data">                     <input type="file" id="file_qr" name="file_qr" /><input type="submit" value="读取二维码" />                     </form>                 </td>                 <td colspan="1">                     <img id="img_qr" alt="要读取的图片" /><br />                     <input id="txt_readqr" type="text" />                 </td>             </tr>         </table>     </div> </body> </html> 三、test.js文件 [javascript] $(document).ready(function () {     var options = {         beforeSubmit: showRequest, […]

龙生   14 Nov 2013
View Details
1 335 336 337 414