浏览器默认<input type="file"/>标签路径为虚拟路径,获取真实路径需要使用File类的API实现

1 篇文章 0 订阅
1 篇文章 0 订阅

居于安全考虑现代的浏览器无法获取到 这样的真实的路径,而得到的是:C://fakepath/文件名这样的结果,而如果我们要实现图片预览效果就需要绝对路径,那么可以使用以下方式实现图片的预览效果

<script type="text/javascript">
             var image = '';
             function selectImage(file){
                 if(!file.files||!file.files[0]){
                     return;
                 }
                 var reader = new FileReader();
                 reader.onload = function(evt){
                     document.getElementById('previewImg').src = evt.target.result;
                     image = evt.target.result;
                 }
                 reader.readAsDataURL(file.files[0]);
             }
</script>

完整的html实例如下:

<!DOCTYPE HTM>
<html> 
    <head>  
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <title>上传图片预览案例</title>
        <link rel="stylesheet" type="text/css" href="css/common.css"/>
        <script type="text/javascript" src="js/jquery-1.11.1.js"></script>
        <!--<script type="text/javascript" src="js/project/pictrue.js"></script> -->
        <!-- <script type="text/javascript" src="js/project/page.js"></script> -->
        <script type="text/javascript">
             var image = '';
             function selectImage(file){
                 if(!file.files||!file.files[0]){
                     return;
                 }
                 var reader = new FileReader();
                 reader.onload = function(evt){
                     document.getElementById('previewImg').src = evt.target.result;
                     image = evt.target.result;
                 }
                 reader.readAsDataURL(file.files[0]);
             }
        </script>
    </head> 
    <body>
        <img id="previewImg" src="image/preview.jpg" width="80" height="80" />
        <form action="uploadServlet.do" method="post"
            enctype="multipart/form-data">
            请选择图片:<input id="myfile" name="myfile" type="file"
                onchange="selectImage(this)" /> 
        </form>
    </body>
</html>
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Javashop开发规范V2.2 版本 说明 提交人 V1.0 初稿 定义了包名、异常、事务、和路径的规范 王峰 V2.0 1. 重新整理了命名规范 2. 增加常用命词对照表 王峰 V2.1 1.增加数据库操作的说明 2.增加常用方法介绍 王峰 V2.2 增加关于数据导入导出的说明 王峰 V2.3 增加校验使用说明(5.3章节) 王峰 1 命名规范 1.1 包命 1. 小写字母 2. 以com.enation.javashop开头 3. 组件以com.enation.compoent开头 1.2 名 一、 action 以Action结尾,如:UserAction 二、 业务 1.接口: 以I开头,以Manager结尾,如:IUserManager 2.实现 以Manager结尾,如:UserManager 三、 组件 以Component结尾,如:ShopEmailComponent 四、 挂件 以Widget结尾,如:MemberAddressWidget 五、 插件 以Plugin结尾,如:SendRegMailPlugin 1.3 变量/属性命名规则 1. 全部小写 2. 可用下划线连接 如:username、 userid 1.4 方法命名 1.4.1 Action add 到添加页 edit 到修改页 saveAdd 保存添加 saveEdit 保存修改 delete 删除 list 列表 1.4.2 业务 add 添加 edit 修改 delete 删除 list 列表 get 读取详细 2 数据库开发规范 2.1 数据操作支持 一、 业务数据库调用 1.继承于BaseSupport 2.在spring文件中声明parent为baseSupport <bean id="xxxManagerImpl" class="xxx.xxx.xxx.XxxxManager" parent="baseSupport"/> 3.通过this.baseDaoSupport操作数据库 实际使用的是:com.enation.eop.sdk.database.BaseJdbcDaoSupport 此种操作示例: com.enation.javashop.core.service.impl.BrandManager 注意事项:见【BaseDaoSupport的意义和存在的问题】 二、 直接声明baseDaoSupport操作数据库 在一些挂件中或某些特殊情况,可以直接需要直接声明baseDaoSupport 此种操作示例: com.enation.javashop.core.service.impl.batchimport.GoodsSpecImporter 注意事项:见【BaseDaoSupport的意义和存在的问题】 2.2 BaseDaoSupport的意义存在的问题 BaseDaoSupport对JdbcDaoSupport进行包装,通过 baseDBRouter 获取表名, 为什么要通过 baseDBRouter 来获取表名呢?Eop机制是支持SAAS(多租户)模式运行的,在SAAS会为每个用户提供如:es_goods_<userid>_<siteid>这样的表。 为了保证在单机版和SAAS模式中都运行正常,BaseDaoSupport将过滤sql中的相应表名。 但目前还只能支持简单的单表select、insert、update,对于多表的联合查询或更新不能支持。 在这种情况下,就需要通过 daoSupport(com.enation.framework.database.impl.JdbcDaoSupport)来操作,daoSupport不对sql进行任何更改,这时为了保证兼容saas模式兼容性,就要使用BaseSupport.getTableName(String tablename)方法 或baseDBRouter.getTableName(String tablename);来保证表名的正确。 (够混乱?真心希望出现一位大侠拯救这个状况,使basedaosupport可以处理所有情况的sql) 2.3 实体Bean和数据库表对照 Javahop数据库操作支持,将对象直接保存或修改,如: this.baseDaoSupport.insert("brand", brand); this.baseDaoSupport.update("brand", brand, "brand_id=" + brand.getBrand_id()); 规则为:实体中的属性名和数据库表的字段名相同,如: 对应的数据库字段: 2.4 注解的使用 2.4.1 @NotDbField 在某个实体Bean中,我们可能会有一些属性不对应数据库字段,这时我们需要在相应的 Geter方法中加上@NotDbField注解,以便使数据库机制知道这个字段不转为sql语句,如: private File file; @NotDbField public File getFile() { return file; } 2.4.2 @PrimaryKeyField 在实合格bean和数据库对照过程中,数据库机制需要识别主键,所以需要我们在主键的对应属性的Geter方法中加上@PrimaryKeyFiled注解,如: private Integer brand_id @PrimaryKeyField public Integer getBrand_id() { return brand_id; } 3 数据导入 3.1 导入接口 DBSolutionFactory.dbImport("file:com/enation/javashop/component/coupon/add.xml","es_"); 3.2 数据Xml文件说明 3.2.1 创建表 <action> <command>create</command> <table>tablename</table> <field> <name>id</name> <type>int</type> <size>8</size> <option>11</option> </field> <field> <name>name</name> <type>varchar</type> <size>255</size> <option>00</option> </field> </action> 3.2.2 删除表 <action> <command>drop</command> <table>tablename</table> </action> 3.2.3 添加、删除列 <action> <command>alter</command> <table>goods</table> <field type="add"> <name>isgroupbuy</name> <type>int</type> <size>1</size> <default>0</default> </field> <field type="drop"> <name>isgroup</name> </field> </action> 3.2.4 创建索引 <action> <command>index</command> <table>goods</table> <field > <name>goodsid</name> </field> </action> 3.2.5 删除索引 <action> <command>unindex</command> <table>goods</table> <field > <name>goodsid</name> </field> </action> 3.2.6 插入数据 <action> <command>insert</command> <table>es_adcolumn</table> <fields>acid,cname,width,height,atype,disabled</fields> <values>5,'列表页上部横幅','972px','67px',0,'false'</values> </action> 3.2.7 删除数据 暂未支持 3.2.8 更新数据 暂未支持 3.3 数据型对照表 xml Mysql Oracle SqlServer int int NUMBER smallint int(1) smallint(1) NUMBER(2) int memo text CLOB text datetime datetime TIMESTAMP datetime long bigint NUMBER bigint decimal decimal NUMBER(20,2) decimal 4 数据导出 String[] tables = new String[1]; tables[0] = "es_auth_action"; DBSolutionFactory.dbExport(tables, false, "") 5 常用方法介绍 5.1 上下文获取 参见: http://www.javamall.com.cn/developer_help/index.php/常用方法 5.2 地区联动下拉框 1.如果是在jsp 中: <html:regionselect></html:regionselect> 2.如果是在Freemarker的html中: <#assign RegionSelect= "com.enation.app.base.component.widget.regions.RegionSelectDirective"?new()> <@RegionSelect /> 以上两种方式均支持以下参数: province_id:省id city_id:市id region_id:区id 如果指定上述参数,则默认选中 5.3 客户端校验 EOP自动为应用提供表单校验功能,通过指定form样式名和指定表单项特定属性的方式来完成。 5.3.1 示例 代码示例 [removed] function checkUserName(val){ if(val=='kingapex' ) return true; else return "用户名已存在"; } $.Validator.options={lang:{isrequired:'此项不能为空!'}}; [removed] <form class="validate"> 必须:<input type="text" name="test1" isrequired="true"> <br/> 整型:<input type="text" name="test2" isrequired="true" dataType="int"> <br/> 浮点型:<input type="text" name="test3" dataType="float"> <br/> 邮件:<input type="text" name="test4" isrequired="true" dataType="email"> <br/> 日期:<input type="text" name="test5" isrequired="true" dataType="date"> <br/> 电话号码:<input type="text" name="test6" isrequired="true" dataType="tel_num"> <br/> 手机:<input type="text" name="test7" isrequired="true" dataType="mobile"> <br/> 邮政编码:<input type="text" name="test8" isrequired="true" dataType="post_code"> <br/> 网址:<input type="text" name="test9" isrequired="true" dataType="url"> <br/> 自定义函数:<input type="text" name="test10" isrequired="true" fun="checkUserName"> <br/> <input type="submit" value="确定" /> </form> 5.3.2 参数说明: 5.3.2.1 isrequired 为true则为必填项,不指定或指为false则为非必填项。 5.3.2.2 dateType 指定校验特殊型,支持的型见下表: 型 说明 int 整数 float 浮点数 email 邮件格式 date 日期格式 tel_num 电话格式 mobile 手机格式 post_code 邮编 url 网址 5.3.2.3 fun 自定义校验函数,返回真则通过校验,返回假或字串则校验失败,返回的字串会出现在失败提示框中。 5.3.2.4 动态绑定校验函数 通过 setValidator实现 $("#region_id").setValidator(function(){ var value = $("#region_id").val(); if( value=="" || value=="0" ) return "地区信息不完整"; else return true; }); 5.3.2.5 提示器 提示器用于显示校验的结果,如果不指定默认会在校验的控件后面创建一个span做为提示器。 可以通过两种方式指定提示器: 一、在控件中声明tiper属性: <input type="text" name="username" tiper="#name_tiper" /> 注:tiper指定的是jquery的一个选择器表达式。 二、动态指定: $("#region_id").setTiper($("#name_tiper")); 注:此时指定的是jquery对象,而不是一个表达式 5.3.2.6 手动调用: $("#siteForm").checkall(); 6 常用字典对照表 6.1 常用值 名称 值 说明 返回结果 0:失败 1:成功 适用于: 1. 客户端json返回值 2. 服务器端方法返回值 3. 数据库是否的标识值 性别 0:女 1:男 6.2 常用名称 名称 英文 商品 goods 货品 product 规格 spec 订单 order 会员 member 积分 point 购物车 cart 结算 checkout 订单 order 品牌 brand 分 cat 优惠劵 coupon 支付 payment 团购 groupbuy 虚拟 virtual 发票 receipt 属性 prop 参数 param 标签 tag 地区 region 7 异常 1. 提供统一的异常处理机制 2. 底层级别的不处理异常,只管向上抛出异常,且统一抛出RuntimeExcepton 8 事务处理 1. 数据库统一使用Srping AOP事务 2. 采用注解方式: 在接口处: @Transactional(propagation = Propagation.isrequired) 9 路径的规范 返回的路径变量最后不带 ‘/’ 如:String path =”user/1”; 使用者: path = path+”/”+myVar; 10 样式/HTML规范 10.1 前台分页 <div class="page"><span class="info">共41条记录</span> <span class="info">1/3</span> <ul><li><a class="selected">1</a></li> <li><a href="search-cat-4-page-2.html" class="unselected">2</a></li> <li><a href="search-cat-4-page-3.html" class="unselected">3</a></li> <li><a href="search-cat-4-page-2.html" class="unselected">>></a></li> <li><a href="search-cat-4-page-3.html" class="unselected">>|</a></li> </ul></div>
下载说明 拷贝AspUpload.dll和所有.asp和.htm文件到你服务器的任何目录,如c:\AspUploadDir. 注册组件从MS DOS或Start/Run执行命令 REGSVR32 c:\AspUploadDir\AspUpload.dll 为了运行示例脚本,你需要将目录c:\AspUploadDir加入IIS虚拟目录清单中(使用Microsoft Managemant Console)开始 这是我们第一个html文件 Test1.htm <HTML> <BODY BGCOLOR="#FFFFFF"> <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="UploadScript1.asp"> <INPUT TYPE=FILE SIZE= 60NAME="FILE1"><BR> <INPUT TYPE=FILE SIZE= 60NAME="FILE2"><BR> <INPUT TYPE=FILE SIZE= 60NAME="FILE3"><BR> <INPUT TYPE=SUBMIT VALUE="Upload!"> </FORM> </BODY> </HTML>注意 在Form标记的属性 ENCTYPE="multipart/form-data" 他指示浏览器发送整个文件到服务器而不只是输入框内的文件名称。 你必须加上在Form标记内加上这个属性,否则将不能上传组件。让我们现在看看处理上传的脚本: UploadScript1.asp: <HTML> <BODY> <% Set Upload = Server.CreateObject("Persits.Upload.1") Count = Upload.Save("c:\upload") %> <% = Count %> files uploaded. </BODY> </HTML> 这段脚本的第一行简单创建了一个AspUpload对象的实例。第二行调用组件的真正实现功能的方法Save:处理浏览器传过来的数据,计算有多少文件被上传了,并把它们保存到指定的本地目录。目录名字可以以"\"结尾,也可以不是。所有文件会被以原来的文件名保存在那个目录下。 Save方法返回成功上传文件的数目,万一出错,这个方法将抛出一个例外(Exception),我们现在可以尝试着上载一些文件。注意:你可以使用表单上这3个输入框中的任何一个或者全部。ASPUpload会找出那个输入框是使用了的,而那个是没有使用的。让我们看一看一个例子的文件,test2.htm和UploadScript2.asp <HTML> <BODY BGCOLOR="#FFFFFF"> <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="UploadScript2.asp"> File 1:<INPUT TYPE=FILE NAME="FILE1"> Description 1:<INPUT TYPE= TEXTNAME="DESCR1"><BR> File 2:<INPUT TYPE=FILE NAME="FILE2"> Description 2:<INPUT TYPE= TEXTNAME="DESCR2"><BR> <INPUT TYPE=SUBMIT VALUE="Upload!"> </FORM> </BODY> </HTML> UploadScript2.asp <HTML> <BODY> <% Set Upload = Server.CreateObject("Persits.Upload.1") Upload.Save "c:\upload" %> Files:<BR> <% For Each File in Upload.Files Response.Write File.Name & "= " & File.Path & " (" & File.Size &")<BR>" Next %> <P> Otheritems:<BR> <% For Each Item in Upload.Form Response.Write Item.Name & "= " & Item.Value &"<BR>" Next %> </BODY> </HTML> 注意:我们的html Form现在有两种输入框,type=filetype=text。因为我们的表单使用了enctype属性,我们可以不再直接通过标准的ASP Request对象方法访问表单变量。 Form集合,由Upload.Form集合来代替。这个集合就等同Request.Form.也就是说,我们可以通过整数或字符串索引访问它的元素,例如:Set Item1 = Upload.Form("DESCR1") 或 Set Item1 = Upload.Form(1). 我们也可以像上面的例子那样使用For-Each语句,遍历集合中的所有元素。Form集合包含的型为FormItem的对象,只有2个字符串的属性,Name和Value(缺省属性) 请记住,upload.Form集合只包括非文件的项目,也就是说非<input type=file>的表单项目。我们还有另外一个集合,叫Files,包含型为UploadFile的对象,代表了从<input typ=file>上传的文件。Files很像Form集合,Files集合也可以使用字符串或者索引访问,或者通过 For-Each语句(如上面所示) 在运行了例子2之后,我们就会看到像这样的东西: Files: FILE1=c:\upload\File1.xls (108544) FILE2=c:\upload\File2.zip (211687) Other items: DESCR1=bla bla DESCR2=test test 注意:我们已经通过UploadFile对象的Path和size属性获得目的路径和上传文件的大小N 如果我们的表单只含有一个文件输入框,如:<INPUT TYPE=FILE NAME="ONLYFILE">,那么就用不着使用for-each语句,我们可以简单这么写: Response.Write Upload.Files("ONLYFILE").Path 或者更通常的可以用 Response.Write Upload.Files(1).Path 注意:除非Save方法被调用,否则Files和Form集合都是无效的。在调用Upload.Save之前调用,是错误的 ' 错误! Upload.Save( Upload.Form("Path") ) 文件大小设定限制 假定你需要限制上传文件的大小,以便防止不符责任的用户消耗你的硬盘空间。你需要做的只是在调用Save之前,使用SetMaxSize方法。 Set Upload = Server.CreateObject("Persits.Upload.1") Upload.SetMaxSize 50000, False Upload.Save "c:\upload" 在这个例子里面我们限制了上传文件为50000字节。这个可选的第二个参数指定是否一个文件大于最大字节数时候是被截断。(如果设置为fase,或者忽略。)或者遇上错误就放弃(如果设置发false)强制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值