介绍
FileTransfer对象提供给了一种将文件上传到服务器的方法,可以通过HTTP和HTTPS进行请求,可以传递一个由FileUploadOptions对象设定的可选参数给upload方法。上传成功后,系统会调用成功回调函数并传递一个FileUploadResult对象。如果出现错误,那么系统会调用错误回调函数并传递一个FileTransferError对象。
安装
cordova plugin add cordova-plugin-file-transfer
支持的平台
· Amazon Fire OS
· Android
· BlackBerry 10
· Browser
· Firefox OS**
· iOS
· Windows Phone 7 and 8*
· Windows
使用方法
这个插件定义了全局的FileTransfer,FileUploadOptions 构造函数。虽然在全局范围内,但是他们需要在deviceready事件之后才可用
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
console.log(FileTransfer);
}
属性
onprogress: 使用調用 `ProgressEvent`每当一个新的数据块传输。(函数)
方法
upload: 将文件发送到服务器。
download: 从服务器下载一个文档。
abort: 中止正在进行的传输。
示例
示例一:上传图片
index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
<title>Hello World</title>
<style>
.line {
padding: 5px;
}
#myImage {
height: 200px;
}
</style>
</head>
<body>
<div class="app">
<div class="line"><button id="openLabrary">按钮</button></div>
<div class="line"><img id="myImage"></img></div>
<div class="line"><span id="text"></span></div>
</div>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</body>
</html>
index.js:
var app = {
initialize: function() {
document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);
},
onDeviceReady: function() {
this.receivedEvent();
},
$$: function(id) {
return document.getElementById(id);
},
receivedEvent: function(){
var getDomLabrary = this.$$('openLabrary');
var _this = this;
getDomLabrary.onclick = function(){
// 打开图片库
navigator.camera.getPicture(onSuccess, onFail, {
quality: 50, // 相片质量是50
sourceType : Camera.PictureSourceType.SAVEDPHOTOALBUM, // 设置从图片库获取
destinationType: Camera.DestinationType.FILE_URI // 以文件路径返回
});
function onSuccess(imageURI) {
console.log(imageURI)
_this.$$('myImage').src = imageURI;
// 上传
_this.upload(imageURI);
}
function onFail(message) {
alert('Failed because: ' + message);
}
}
},
//使用FileTransfer插件,上传文件
upload(fileURL) {
//上传成功
var success = function (r) {
alert("上传成功! Code = " + r.responseCode);
}
//上传失败
var fail = function (error) {
alert("上传失败! Code = " + error.code);
}
var options = new FileUploadOptions();
options.fileKey = "file1";
options.fileName = fileURL.substr(fileURL.lastIndexOf('/') + 1);
//options.mimeType = "text/plain";
//上传参数
var params = {};
params.value1 = "test";
params.value2 = "param";
options.params = params;
var ft = new FileTransfer();
//上传地址
var SERVER = "http://10.1.10.53:8089/oss/UploadServlet"
ft.upload(fileURL, encodeURI(SERVER), success, fail, options);
}
};
app.initialize();
运行:
点击按钮,打开图片库,选择图片,显示
上传成功
备注:
这个上传的服务器路径:
var SERVER = "http://10.1.10.53:8089/oss/UploadServlet"
使用了一个.jsp文件写成的
示例二:下载图片
index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
<title>Hello World</title>
<style>
.line {
padding: 5px;
}
#myImage {
height: 200px;
}
</style>
</head>
<body>
<div class="app">
<div class="line"><button id="download">下载</button></div>
<div class="line"><img id="myImage"></img></div>
<div class="line"><span id="text"></span></div>
</div>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</body>
</html>
index.js:
var app = {
// Application Constructor
initialize: function() {
document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);
},
// deviceready Event Handler
onDeviceReady: function() {
this.receivedEvent();
},
// get DOM
$$: function(id) {
return document.getElementById(id);
},
receivedEvent:function() {
var _this = this;
var dlDom = this.$$('download');
dlDom.onclick = function() {
_this.createFilePath();
}
},
// 创建文件路径
createFilePath: function() {
var _this = this;
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fs) {
fs.root.getFile("downloadedImage.png", { create: true, exclusive: false }, function (fileEntry) {
console.log(fileEntry);
//调用fileTransfer插件,下载图片
_this.downLoadImg(fileEntry.nativeURL);
}, function(err) {
console.log(err);
});
}, function(error) {
console.log(error);
});
},
// fileTransfer plugin
downLoadImg: function(fileURL) {
var _this = this;
// 初始化FileTransfer对象
var fileTransfer = new FileTransfer();
// 服务器下载地址
var uri = encodeURI("http://avatar.csdn.net/7/E/0/1_michael_ouyang.jpg");
// 调用download方法
fileTransfer.download(
uri, //uri网络下载路径
fileURL, //url本地存储路径
function(entry) {
console.log("download complete: " + entry.toURL());
_this.$$('myImage').src = entry.toURL();
},
function(error) {
console.log("download error source " + error.source);
console.log("download error target " + error.target);
console.log("upload error code" + error.code);
}
);
}
};
app.initialize();
运行:
点击按钮,下载图片
图片下载成功后,显示在页面上
备注:
控制台输出的fileEntry对象的内容
拿到这个图片在手机系统的路径
file:///data/user/0/com.abc.www/files/files/downloadedImage.png
现在打开手机的文件管理器,是找不到该图片的
因为我们没有设置持久化文件的保存路径,默认会保存在data里面
那么在config.xml中加上这一句代码
<preference name="AndroidPersistentFileLocation"value="Compatibility"/>
再启动应用下载图片,fileEntry对象的nativeURL变成了storage
file:///storage/emulated/0/downloadedImage.png
打开手机的文件管理器,查看下载回来的图片