简体   繁体   English

Phonegap - 将图像从网址保存到设备照片库中

[英]Phonegap - Save image from url into device photo gallery

I'm developing phonegap application and I need to save Image from url to the Device Photo Gallery. 我正在开发phonegap应用程序,我需要将图像从URL保存到设备照片库。

I can't find at the Phonegap Api a way for doing it and Also I didn't find phonegap plugin for that. 我在Phonegap Api上找不到这样做的方法,而且我没有为此找到phonegap插件。

I need it to work with Iphone & Android 我需要它与Iphone和Android合作

Thanks a lot! 非常感谢!

This is file download code which can be used by anyone. 这是任何人都可以使用的文件下载代码。 You just have three parameters to use this like- 你只需要三个参数来使用它 -

1) URL 1) URL

2) Folder name which you want to create in your Sdcard 2)要在Sdcard中创建的文件夹名称

3) File name (You can give any name to file) 3) 文件名 (您可以为文件指定任何名称)

All types of file can download by using this code. 所有类型的文件都可以使用此代码下载。 you can use this as .js And this works on IOS also. 你可以使用它作为.js这也适用于IOS

//First step check parameters mismatch and checking network connection if available call    download function
function DownloadFile(URL, Folder_Name, File_Name) {
//Parameters mismatch check
if (URL == null && Folder_Name == null && File_Name == null) {
    return;
}
else {
    //checking Internet connection availablity
    var networkState = navigator.connection.type;
    if (networkState == Connection.NONE) {
        return;
    } else {
        download(URL, Folder_Name, File_Name); //If available download function call
    }
  }
}

//Second step to get Write permission and Folder Creation //获取写入权限和文件夹创建的第二步

function download(URL, Folder_Name, File_Name) {
//step to request a file system 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, fileSystemSuccess, fileSystemFail);

function fileSystemSuccess(fileSystem) {
    var download_link = encodeURI(URL);
    ext = download_link.substr(download_link.lastIndexOf('.') + 1); //Get extension of URL

    var directoryEntry = fileSystem.root; // to get root path of directory
    directoryEntry.getDirectory(Folder_Name, { create: true, exclusive: false }, onDirectorySuccess, onDirectoryFail); // creating folder in sdcard
    var rootdir = fileSystem.root;
    var fp = rootdir.fullPath; // Returns Fulpath of local directory

    fp = fp + "/" + Folder_Name + "/" + File_Name + "." + ext; // fullpath and name of the file which we want to give
    // download function call
    filetransfer(download_link, fp);
}

function onDirectorySuccess(parent) {
    // Directory created successfuly
}

function onDirectoryFail(error) {
    //Error while creating directory
    alert("Unable to create new directory: " + error.code);
}

  function fileSystemFail(evt) {
    //Unable to access file system
    alert(evt.target.error.code);
 }
}

//Third step for download a file into created folder //将文件下载到创建文件夹的第三步

function filetransfer(download_link, fp) {
var fileTransfer = new FileTransfer();
// File download function with URL and local path
fileTransfer.download(download_link, fp,
                    function (entry) {
                        alert("download complete: " + entry.fullPath);
                    },
                 function (error) {
                     //Download abort errors or download failed errors
                     alert("download error source " + error.source);
                     //alert("download error target " + error.target);
                     //alert("upload error code" + error.code);
                 }
            );
}

Useful Link 有用的链接

The latest version of Cordova (3.3+), the newer (1.0.0+) version of File uses filesystem URLs instead of the file path. 最新版本的Cordova(3.3 +),较新的(1.0.0+)版本的File使用文件系统URL而不是文件路径。 So, to make the accepted answer work with the newer version in the FileSystemSuccess function change the line: 因此,要使接受的答案与FileSystemSuccess函数中的较新版本一起使用,请更改以下行:

var fp = rootdir.fullPath; 

to: 至:

var fp = rootdir.toURL(); 

Another easy way is to use the Cordova/Phonegap plugin Canvas2ImagePlugin . 另一种简单的方法是使用Cordova / Phonegap插件Canvas2ImagePlugin Install it and add the following function to your code which is based on getImageDataURL() by Raul Sanchez (Thanks!). 安装它并将以下函数添加到您的代码中,该函数基于Raul Sanchez的getImageDataURL() (谢谢!)。

function saveImageToPhone(url, success, error) {
    var canvas, context, imageDataUrl, imageData;
    var img = new Image();
    img.onload = function() {
        canvas = document.createElement('canvas');
        canvas.width = img.width;
        canvas.height = img.height;
        context = canvas.getContext('2d');
        context.drawImage(img, 0, 0);
        try {
            imageDataUrl = canvas.toDataURL('image/jpeg', 1.0);
            imageData = imageDataUrl.replace(/data:image\/jpeg;base64,/, '');
            cordova.exec(
                success,
                error,
                'Canvas2ImagePlugin',
                'saveImageDataToLibrary',
                [imageData]
            );
        }
        catch(e) {
            error(e.message);
        }
    };
    try {
        img.src = url;
    }
    catch(e) {
        error(e.message);
    }
}

Use it like this: 像这样使用它:

var success = function(msg){
    console.info(msg);
};

var error = function(err){
    console.error(err);
};

saveImageToPhone('myimage.jpg', success, error);

This can be done using phone gap file plugin: 这可以使用手机间隙文件插件完成:

 var url = 'http://image_url';
    var filePath = 'local/path/to/your/file';
    var fileTransfer = new FileTransfer();
    var uri = encodeURI(url);

    fileTransfer.download(
        uri,
        filePath,
        function(entry) {
            console.log("download complete: " + entry.fullPath);
        },
        function(error) {
            console.log("download error source " + error.source);
            console.log("download error target " + error.target);
            console.log("upload error code" + error.code);
        },
        false,
        {
            headers: {
                "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
            }
        }
    );

Maybe you could try the plugin I wrote for IOS 也许你可以试试我为IOS写的插件

here is the git link: https://github.com/Nomia/ImgDownloader 这是git链接: https//github.com/Nomia/ImgDownloader

Short Example: 简短示例:

document.addEventListener("deviceready",onDeviceReady);

//google logo url
url = 'https://www.google.com/images/srpr/logo11w.png';

onDeviceReady = function(){
    cordova.plugins.imgDownloader.downloadWithUrl(url,function(){
        alert("success");
    },function(){
        alert("error");
    });        
}

//also you can try dataUri like: 1px gif
//url = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'

you can also save a local file to image gallery use the download method 您还可以使用下载方法将本地文件保存到图库

Simplest approach 最简单的方法

If you are ok with it being in the download's folder do the following 如果你对它在下载的文件夹中没问题,请执行以下操作

  1. Install In-App browser plugin 安装应用程序内浏览器插件

     cordova plugin add cordova-plugin-inappbrowser 
  2. Create a download button with 创建一个下载按钮

     onclick="window.open("Image_URL", '_system'); 

Not only will this download the image it will offer to open the image in the corresponding app or browser. 这不仅会下载它将提供的图像,以在相应的应用程序或浏览器中打开图像。

I'm currently working on cordova-plugin-photo-library . 我目前正在研究cordova-plugin-photo-library

It can save image that given by url (file:// or data:). 它可以保存url(file://或data :)给出的图像。 Works on ios and android, jpeg/png/gif: 适用于ios和android,jpeg / png / gif:

 cordova.plugins.photoLibrary.saveImage(url, 'My album', function () {}, function (err) {}); 

I initially got "Could not create target file" . 我最初得到"Could not create target file"

For that use encodeURI() on the url to download: 为此,请在url上下载encodeURI()

var DBuri = encodeURI("https://dl.dropbox.com/u/13253550/db02.xml");
fileTransfer.download(
    DBuri,
sPath + "database.xml",

And the code in this thread worked perfectly. 并且该线程中的代码运行良好。 Just putting it out here. 把它放在这里。

I cleaned-up and wrapped the code suggested by Suhas above - the accepted answer in an angular service so that it can easily be used in other application. 我清理并包装上面Suhas建议的代码-在角度服务中接受的答案 ,以便它可以很容易地用于其他应用程序。 You can find the snipet here . 你可以在这里找到snipet。

To use it, you include the script in app.js (and your index.html file) then: 要使用它,请在app.js(和index.html文件)中包含脚本,然后:

angular.module('myApp.controllers.whatever', [])
    .controller('WhateverController', function ($scope, SaveToGalleryService) {

    $scope.savePhoto = function(photoUrl, folderName, fileName, callback) {
        var fileName = new Date().getTime();
        SaveToGalleryService.saveToGallery(photoUrl, "Kiddiz.me", fileName, function saveSuccess(res) {
            console.log("Photo ", photoUrl, "photo saved", res);
            if (callback) {
                callback(true, res);
            }
        }, function saveFail () {
            console.log("Photo ", photoUrl, "failed to save photo");
            if (callback) {
                callback(false);
            }
        });
    }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM