Cordova FileUpload API returns 错误代码 3
Cordova FileUpload API returns error code 3
我在尝试将图像文件上传到我的本地 Web 服务器(使用 wampserver 托管)时遇到问题 android 使用 IBM Worklight 6.2.0 和 Cordova 版本 3.4.0 构建的混合应用程序。代码片段如下:
<script type="text/javascript" charset="utf-8">
// Wait for Cordova to load
document.addEventListener("deviceready", onDeviceReady, false);
// Cordova is ready
function onDeviceReady() {
// Nothing here
}
function getImage() {
// Retrieve image file location from specified source
navigator.camera.getPicture(uploadPhoto, function(message) {
alert('get picture failed');
}, {
quality: 40,
destinationType: Camera.DestinationType.FILE_URI,
sourceType: Camera.PictureSourceType.PHOTOLIBRARY
});
}
function uploadPhoto(imageURI) {
var options = new FileUploadOptions();
options.fileKey = "file";
options.fileName = imageURI.substr(imageURI.lastIndexOf('/') + 1);
options.mimeType = "image/jpeg";
var params = new Object();
params.value1 = "test";
params.value2 = "param";
options.params = params;
options.chunkedMode = false;
var ft = new FileTransfer();
ft.upload(imageURI, encodeURI("http://192.168.1.4:8081/folder_name/upload2.php"), win, fail, options);
}
function win(r) {
console.log("Code = " + r.responseCode);
console.log("Response = " + r.response);
console.log("Sent = " + r.bytesSent);
alert(r.response);
}
function fail(error) {
alert("An error has occurred: Code = " + error.code);
}
</script>
<button onclick="getImage();">Upload a Photo</button>
upload2.php
<?php print_r($_FILES); $new_image_name="namethisimage.jpg" ; move_uploaded_file($_FILES[ "file"][ "tmp_name"], "folder_name/uploads/".$new_image_name); ?>
我收到 http 状态 200 和错误代码 3。除此之外,我还在 http 状态和错误代码错误下方收到此错误。
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/image:14584 from pid=4926, uid=10092 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
有什么解决办法吗?或者有什么更好的上传图片文件的方法吗?
我已将以下内容添加到 AndroidManifest.xml
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
根据最后一张图片,您似乎以某种方式解决了这个问题 - 您应该分享它作为答案。
无论如何,
为什么您的代码段中有 PHP 代码?此代码片段是否源自您基于 Worklight 的应用程序?你不能在那里 PHP...这是一个移动应用程序,运行 在你的设备上,而不是在你的服务器上。那里没有任何东西可以解释该代码。
不应在您的应用程序中使用以下内容,因为 Cordova 是 Worklight 框架的一部分并且此检查是在内部完成的。相反,您的代码应该位于 main.js 中的 wlCommonInit() 函数内,或者从那里调用。
// Wait for Cordova to load
document.addEventListener("deviceready", onDeviceReady, false);
// Cordova is ready
function onDeviceReady() {
// Nothing here
}
我怀疑这就是为什么对您不起作用的原因。尝试使用 AJAX 向服务器发出请求,接收发送的图像并将其存储在您的网络服务器中。
我不确定这里有什么问题。即使使用 AngularJS,我的代码也会突然工作。如果其他人可能想参考,我将在这里分享我的工作代码。
main.js
$scope.getImage = function() {
// Retrieve image file location from specified source
navigator.camera.getPicture(onSuccess, function(message) {
alert('get picture failed');
},{
quality: 50,
destinationType: Camera.DestinationType.FILE_URI,
sourceType: Camera.PictureSourceType.PHOTOLIBRARY
}
);
}
function onSuccess(imageURI) {
$scope.image = imageURI;
};
function uploadPhoto(image) {
var options = new FileUploadOptions();
options.fileKey="file";
options.fileName= $scope.imageName;
options.mimeType="image/jpeg";
var params = new Object();
params.value1 = "test";
params.value2 = "param";
options.params = params;
options.chunkedMode = false;
var ft = new FileTransfer();
ft.upload(image, encodeURI(ipaddress_to_your_server/root_folder/upload.php), win, fail, options);
}
function win(r) {
console.log("Code = " + r.responseCode);
console.log("Response = " + r.response);
console.log("Sent = " + r.bytesSent);
alert(r.response);
}
function fail(error) {
alert("An error has occurred: Code = " + error.code);
}
upload.php
<?php
print_r($_FILES);
$image_name = $_FILES['file']['name'];
move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/".$image_name);
?>
您只需调用 html 中的 $scope.getImage
函数即可打开设备的照片库。
我在尝试将图像文件上传到我的本地 Web 服务器(使用 wampserver 托管)时遇到问题 android 使用 IBM Worklight 6.2.0 和 Cordova 版本 3.4.0 构建的混合应用程序。代码片段如下:
<script type="text/javascript" charset="utf-8">
// Wait for Cordova to load
document.addEventListener("deviceready", onDeviceReady, false);
// Cordova is ready
function onDeviceReady() {
// Nothing here
}
function getImage() {
// Retrieve image file location from specified source
navigator.camera.getPicture(uploadPhoto, function(message) {
alert('get picture failed');
}, {
quality: 40,
destinationType: Camera.DestinationType.FILE_URI,
sourceType: Camera.PictureSourceType.PHOTOLIBRARY
});
}
function uploadPhoto(imageURI) {
var options = new FileUploadOptions();
options.fileKey = "file";
options.fileName = imageURI.substr(imageURI.lastIndexOf('/') + 1);
options.mimeType = "image/jpeg";
var params = new Object();
params.value1 = "test";
params.value2 = "param";
options.params = params;
options.chunkedMode = false;
var ft = new FileTransfer();
ft.upload(imageURI, encodeURI("http://192.168.1.4:8081/folder_name/upload2.php"), win, fail, options);
}
function win(r) {
console.log("Code = " + r.responseCode);
console.log("Response = " + r.response);
console.log("Sent = " + r.bytesSent);
alert(r.response);
}
function fail(error) {
alert("An error has occurred: Code = " + error.code);
}
</script>
<button onclick="getImage();">Upload a Photo</button>
upload2.php
<?php print_r($_FILES); $new_image_name="namethisimage.jpg" ; move_uploaded_file($_FILES[ "file"][ "tmp_name"], "folder_name/uploads/".$new_image_name); ?>
我收到 http 状态 200 和错误代码 3。除此之外,我还在 http 状态和错误代码错误下方收到此错误。
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/image:14584 from pid=4926, uid=10092 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
有什么解决办法吗?或者有什么更好的上传图片文件的方法吗?
我已将以下内容添加到 AndroidManifest.xml
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
根据最后一张图片,您似乎以某种方式解决了这个问题 - 您应该分享它作为答案。
无论如何,
为什么您的代码段中有 PHP 代码?此代码片段是否源自您基于 Worklight 的应用程序?你不能在那里 PHP...这是一个移动应用程序,运行 在你的设备上,而不是在你的服务器上。那里没有任何东西可以解释该代码。
不应在您的应用程序中使用以下内容,因为 Cordova 是 Worklight 框架的一部分并且此检查是在内部完成的。相反,您的代码应该位于 main.js 中的 wlCommonInit() 函数内,或者从那里调用。
// Wait for Cordova to load document.addEventListener("deviceready", onDeviceReady, false); // Cordova is ready function onDeviceReady() { // Nothing here }
我怀疑这就是为什么对您不起作用的原因。尝试使用 AJAX 向服务器发出请求,接收发送的图像并将其存储在您的网络服务器中。
我不确定这里有什么问题。即使使用 AngularJS,我的代码也会突然工作。如果其他人可能想参考,我将在这里分享我的工作代码。
main.js
$scope.getImage = function() {
// Retrieve image file location from specified source
navigator.camera.getPicture(onSuccess, function(message) {
alert('get picture failed');
},{
quality: 50,
destinationType: Camera.DestinationType.FILE_URI,
sourceType: Camera.PictureSourceType.PHOTOLIBRARY
}
);
}
function onSuccess(imageURI) {
$scope.image = imageURI;
};
function uploadPhoto(image) {
var options = new FileUploadOptions();
options.fileKey="file";
options.fileName= $scope.imageName;
options.mimeType="image/jpeg";
var params = new Object();
params.value1 = "test";
params.value2 = "param";
options.params = params;
options.chunkedMode = false;
var ft = new FileTransfer();
ft.upload(image, encodeURI(ipaddress_to_your_server/root_folder/upload.php), win, fail, options);
}
function win(r) {
console.log("Code = " + r.responseCode);
console.log("Response = " + r.response);
console.log("Sent = " + r.bytesSent);
alert(r.response);
}
function fail(error) {
alert("An error has occurred: Code = " + error.code);
}
upload.php
<?php
print_r($_FILES);
$image_name = $_FILES['file']['name'];
move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/".$image_name);
?>
您只需调用 html 中的 $scope.getImage
函数即可打开设备的照片库。