Подтвердить что ты не робот

Phonegap - Сохранить изображение с URL-адреса в галерее устройств

Я разрабатываю приложение phonegap, и мне нужно сохранить изображение с URL-адреса в галерею устройств.

Я не могу найти в Phonegap Api способ сделать это, а также я не нашел для него плагин для телефонных разговоров.

Мне нужно, чтобы он работал с Iphone и Android

Спасибо большое!

4b9b3361

Ответ 1

Это код загрузки файла, который может использоваться кем угодно. У вас есть только три параметра, чтобы использовать это как -

1) URL

2) Имя папки, которое вы хотите создать на своей Sdcard

3) Имя файла (вы можете указать любое имя в файл)

Все типы файлов можно загрузить с помощью этого кода. вы можете использовать это как .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
    }
  }
}

//Второй шаг для получения разрешения на запись и создания папки

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);
 }
}

//Третий шаг для загрузки файла в созданную папку

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);
                 }
            );
}

Полезная ссылка

Ответ 2

Последняя версия Кордовы (3.3+), новая (1.0.0+) версия Файла использует URL-адреса файловой системы вместо пути к файлу. Таким образом, чтобы принятый ответ работал с более новой версией в функции FileSystemSuccess, измените строку:

var fp = rootdir.fullPath; 

в

var fp = rootdir.toURL(); 

Ответ 3

Еще один простой способ - использовать плагин Cordova/Phonegap Canvas2ImagePlugin. Установите его и добавьте следующую функцию в свой код, который основан на getImageDataURL() от Raul Sanchez (Спасибо!).

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);
    }
}

Используйте его следующим образом:

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

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

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

Ответ 4

Это можно сделать, используя блокировку телефона file:

 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=="
            }
        }
    );

Ответ 5

Может быть, вы можете попробовать плагин, который я написал для IOS

вот ссылка git: https://github.com/Nomia/ImgDownloader

Краткий пример:

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'

вы также можете сохранить локальный файл в галерее изображений с помощью метода скачать

Ответ 6

В настоящее время я работаю над cordova-plugin-photo-library.

Он может сохранять изображение, заданное url (file://или data:). Работает на ios и android, jpeg/png/gif:

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

Ответ 7

Я изначально получил "Could not create target file".

Для этого используйте encodeURI() на url для загрузки:

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

И код в этом потоке работал отлично. Просто поставьте его здесь.

Ответ 8

Самый простой подход

Если вы в порядке, находясь в папке загрузки, выполните следующие

  • Установите плагин для браузера In-App

    cordova plugin add cordova-plugin-inappbrowser
    
  • Создайте кнопку загрузки с помощью

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

Не только загрузит изображение, которое он предложит, чтобы открыть изображение в соответствующем приложении или в браузере.

Ответ 9

Я очистил и завернул код, предложенный Сухасом выше - принятый ответ в службе angular, чтобы он мог быть легко использован в другом приложении. Вы можете найти snipet здесь.

Чтобы использовать его, вы включаете script в 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);
            }
        });
    }
});