JavaScript进阶(九)JS实现本地文件上传至阿里云服务器
JS实现本地文件上传至阿里云服务器
前言
在前面的博客《 JavaScript进阶(八)JS实现图片预览并导入服务器功能》(点击查看详情)中,实现了JS将本地图片文件预览并上传至阿里云服务器的操作。这次需要实现将本地打包好的文件上传至阿里云服务器。使用前面的图片文件上传方法无法完成此操作。操作界面如下:
思路
本地与服务端传输文件的格式应该是熟悉的Base64格式。首先需要将本地文件转换为Base64格式,传输至服务端后,在服务端再将Base64格式的文件转换为原始文件。
源码解析
控制器
/*--------------移动APP版本管理G030 G031-------------------------*/ medModule.controller('VersionController',function($scope, $http){ $scope.queryFun = function() { try{ appCallServer($http,"G030",{"mangid":localStorage.mangid }, //success function function(data){ $scope.currentVersion = data.version; }, //fail function function(data){ //alert("未找到记录:"+data.errtext); }); }catch(error){ alert("G030:"+error.message); } }; $scope.queryFun(); // 上传文件 $scope.doTx = function() { var appBase64 = document.getElementById("appBase64").innerHTML; // 获取文件Base64编码内容 var sunny = document.getElementById("appName").innerHTML; // 获取文件名称(PS:瞬间感觉自己好聪明啊~~) var appName = sunny.substr(0, sunny.length-4); // 获取子字符串。 /*alert(appBase64); alert(appName);*/ if(appBase64.length == 0){ alert("请选择有效文件[该文件为空]"); } try { appCallServer($http, "G031", { "mangid" : localStorage.mangid, "appBase64": appBase64, "appVersion" : appName }, // success function function(data) { alert("上传文件成功"); }, // fail function function(data) { alert("上传文件失败:" + data.errtext); }); } catch (error) { alert("G031:" + error.message); } }; });
Html脚本
<script type="text/javascript"> function loadAppFile(source) { var file = source.files[0]; if (window.FileReader) { var fr = new FileReader(); // onloadend读取完成触发,无论成功或失败.如果读取失败,则 result的值为 null,否则即是读取的结果 fr.onloadend = function(e) { var content = e.target.result; if(content != null){ var arr = content.toString().split(","); // 将文件Base64编码内容传至页面 document.getElementById("appBase64").innerHTML = arr[1]; // 获取图片名称(PS:瞬间感觉自己好聪明啊~~) document.getElementById("appName").innerHTML = document.getElementById("appInput").files[0].name; /* alert(document.getElementById("appInput").files[0].name); alert(document.getElementById("appName").innerHTML); alert(document.getElementById("appBase64").innerHTML); */ } }; fr.readAsDataURL(file); } } </script>
服务端接收代码
/************************* 更新移动APP版本信息 *************************/ public static boolean do_G031(RequestMessage request,ResponseMessage response){ logger.info("\n\n------------Update_APP_G031 debug info-------------\n请求数据包信息:" + request.json.toString()); if(!Pubf.checkMangSession(request,response)){ return(false); } try{ String app,version; app = request.getString("appBase64").trim(); version = request.getString("appVersion").trim(); /*--------------------------- 将应用存进服务端 ---------------------------*/ if(!app.equals("")){ logger.info("开始写文件....."); FileUtil.GenerateApp(app, MyConst.APP_FILE_PATH + version + ".wgt"); logger.info("写文件完成....."); /*-------------------------将应用版本号写进版本文件--------------------------*/ logger.info("开始写入版本号....."); FileUtil.writeFile(MyConst.APP_VERSION_FILE_PATH, version); logger.info("写版本号完成....."); return(true); }else{ return(false); } }catch(Exception e){ e.printStackTrace(); response.errtext = "移动APP更新失败"; response.result = MyConst.ERR_FORMAT; return(false); } }
工具类
<pre name="code" class="java">/** * * @param appStr 应用内容 * @param appFilePath 应用存放路径 * @return */ public static boolean GenerateApp(String appStr, String appFilePath) { // 对字节数组字符串进行Base64解码并生成wgt更新包 if (appStr == null) // 文件数据为空 return false; BASE64Decoder decoder = new BASE64Decoder(); try { // Base64解码 byte[] b = decoder.decodeBuffer(appStr); for (int i = 0; i < b.length; ++i) { if (b[i] < 0) {// 调整异常数据 b[i] += 256; } } // 生成wgt应用 OutputStream out = new FileOutputStream(appFilePath); out.write(b); out.flush(); out.close(); return true; } catch (Exception e) { return false; } }
读取到的文件内容如下:
由上图可见,其编码方式正是我们之前所说的Base64编码方式。那么接下来的工作就很好做了。按照之前图片处理的思路即可。
期间自己也遇到了一部分问题。例如
<i id="appBase64" hidden="hidden"></i>
<i id="appName" hidden="hidden"></i>
隐藏元素的位置,尽量将其置于靠近提交Buton的附近,否则在控制器中获取不到其内容。
经过以上步骤,就可以实现将更新包上传至服务端相应更新文件夹中,同时将更新包版本号信息写入相应的version.txt文件内。
代码领悟
将以上代码与之前做过的图片上传做对比,发现两者在数据获取时的方式是不同的,本文使用了HTML5之FileReader方法(点击查看详情)。之前做图片上传时应用此方法亦可以解决问题。两者写入服务端的方法是相同的,均是将Base64编码内容写入文件中。思路清晰了,问题自然会很容易得到解决。
进一步优化
幸福永不满足,在以上文件上传过程中会遇到较大文件的上传,为此可能需要等待1min,甚至若干分钟,这是让人无法忍受的事情。为了增强用户的使用体验。特为文件上传增加进度条美化效果。详情见下篇博客。
参考文献
1.http://blog.csdn.net/sunhuaqiang1/article/details/50475429
2.http://www.ibm.com/developerworks/cn/web/1101_hanbf_fileupload/
3.http://blog.csdn.net/jackfrued/article/details/8967667
4.http://www.cnblogs.com/hema/archive/2009/10/21/1587560.html
5.http://www.108js.com/article/article7/70001.html?id=26
鸣谢
美文美图
JavaScript进阶(九)JS实现本地文件上传至阿里云服务器的更多相关文章
- 将本地文件上传到指定的服务器(HttpWebRequest方法)
将本地文件上传到指定的服务器(HttpWebRequest方法),通过文件流,带文件名,同文件一同上传的表单文本域及值. ///<summary> /// 将本地文件上传到指定的服务器(H ...
- Windows环境下用C#编程将文件上传至阿里云OSS笔记
Windows环境下用C#编程将文件上传至阿里云OSS笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/detai ...
- Java下载https文件上传到阿里云oss服务器
Java下载https文件上传到阿里云oss服务器 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** ...
- Wordpress上传到阿里云服务器
Wordpress上传到阿里云服务器 登录服务器 https://account.aliyun.com/login/login.htm 绑定域名 获取FTP信息.数据库信息 在本地修改wordpres ...
- 通过git将本地文件上传到码云的方法
1. 在码云上创建项目 在码云首页顶部,下图所示,右上角头像旁边的加号,鼠标移上去会显示下拉的,点击“新建项目”. 2. 安装Git 下载完成后安装即可,安装过程中没有注意事项,全部默认一直next直 ...
- OSS文件上传到阿里云
<script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.min.js"></script&g ...
- Linux本地数据上传到阿里云OSS
这篇文章主要是介绍如何将服务器本地的数据上传到阿里云OSS的指定bucket中,最重要的参考文档是数据迁移单机部署.我第一次上传数据到OSS上时,步骤要比前面的链接中介绍的要麻烦,ossimport工 ...
- Mac将本地文件上传到Centos7(Linux)服务器上
1.打开终端,输入命令: scp /Users/codez/Downloads/jdk-8u144-linux-x64.tar.gz root@139.224.235.xxx:/root/java/j ...
- springmvc学习笔记--支持文件上传和阿里云OSS API简介
前言: Web开发中图片上传的功能很常见, 本篇博客来讲述下springmvc如何实现图片上传的功能. 主要讲述依赖包引入, 配置项, 本地存储和云存储方案(阿里云的OSS服务). 铺垫: 文件上传是 ...
随机推荐
- Linux服务器搭建相关教程链接整理
Linux: Linux 教程 | 菜鸟教程 linux下如何添加一个用户并且让用户获得root权限 - !canfly - 博客园 Git: 在 Linux 下搭建 Git 服务器 - 黄棣-dee ...
- Docker创建 tomcat/weblogic 集群
安装 tomcat 镜像 准备好需要的 jdk.tomcat 等软件放到 home 目录下面,启动一个容器 docker run -t -i -v /home:/opt/data --name mk_ ...
- Unity3D开发注意事项
最近给组里定Unity开发注意事项,参考了@陆泽西在群里分享的[前端开发规范],结合自己工作中的经验,整理一下,下面不少条款都是我们要求在开发中必须遵守的. 资源: 图片统一为png格式,纹理属性:T ...
- synchronized与条件同步
在并发编程中,有这样的需求:当满足某个条件时线程执行同步块中的代码,条件不满足时,让线程在此等待,直至条件满足再执行同步代码块. java的Object类即提供了一类这样的方法wait(),notif ...
- sublimetext 自定义build
Nodejs { "cmd": "node $file", "shell": "true", "selecto ...
- Scala:集合类型Collection和迭代器
http://blog.csdn.net/pipisorry/article/details/52902549 Scala Collection Scala 集合分为可变的和不可变的集合. 可变集合可 ...
- Android安全升级的7.0: Nougat
Tamic http://www.jianshu.com/users/3bbb1ddf4fd5/latest_articles 今年夏天以来,Google做了多种增强的安全性在Android的7.0N ...
- bitbucket添加ssh key
右上角头像->bitbucket settings->ssh keys 直接点击: https://bitbucket.org/account/user/.../ssh-keys/ 教程: ...
- linux源码编译安装OpenCV
为了尽可能保证OpenCV的特性,使用OpenCV源码编译安装在linux上.先从安装其依赖项开始,以ubuntu 14.04.X为例讲解在Linux上源码编译安装OpenCV,其他linux版本可以 ...
- tomcat启动批处理——catalina.bat
这个批处理才是tomcat服务器启动跟关闭的核心脚本.其中包括....(各种变量),此节将详细讲解这个批处理的逻辑. 先看看第一部分脚本: ****************************** ...