Статьи

JavaScript API Parse теперь поддерживает файлы

Простите за несколько случайный характер этого блога. У меня есть ограниченное количество времени, прежде чем я сижу в самолете, но я не хотел ждать до утра, чтобы отправить. Ранее сегодня читатель (Arcayne — звучит как X-Man начала 80-х) опубликовал комментарий, благодаря которому я обнаружил, что JavaScript-API Parse теперь поддерживает файлы. Это не было возможно в прошлом. Вы можете прочитать подробности об этом здесь, но для тех, кто хочет увидеть полный демонстрационный код, продолжайте читать.

Первое, что я сделал, это построил полную демонстрацию, используя их пример загрузки файла. Я начал с создания простого файла HTML:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width">
    </head>
    <body>
        
        <input type="file" id="fileUploader">
        <button id="fileUploadBtn">Send</button>

        <script src="js/jquery-2.0.3.min.js"></script>
        <script src="js/parse-1.2.8.min.js"></script>
        <script src="js/app.js"></script>        
    </body>
</html>

Обратите внимание, у меня загружена библиотека Parse. HTML просто содержит поле файла и кнопку. Вот код JavaScript:

$(document).ready(function() {
   
    var parseAPPID = "x";
    var parseJSID = "x";
    
    //Initialize Parse
    Parse.initialize(parseAPPID,parseJSID);
    
    $("#fileUploadBtn").on("click", function(e) {

        var fileUploadControl = $("#fileUploader")[0];
        if (fileUploadControl.files.length > 0) {
            var file = fileUploadControl.files[0];
            var name = "photo.jpg";
            console.log("here goes nothing...");
            var parseFile = new Parse.File(name, file);
            parseFile.save().then(function() {
                console.log("Woot!");
                console.dir(arguments);
            }, function(error) {
                console.log("Error");
                console.dir(error);
            });
        }

    });
    
});

По большей части это то, что есть в документации Parse, но, как полный файл, надеюсь, это будет полезно. Я могу подтвердить, что это сработало отлично. В объекте результата я получил URL к загруженной картинке. Конечно, если бы я не выбрал изображение, это не сработало бы. У вас есть доступ к имени файла, поэтому теоретически строка 14 может быть легко сделана динамической.

Хорошо, я плохо себя чувствовал. Исправление было одной строкой:

var name = file.name;

В зипе я поделюсь, это исправлено. Так что — это будет работать в PhoneGap, если ваш мобильный клиент позволяет поля загрузки файлов. Я не уверен, что делать. Я знаю, что iOS позволяет вам снимать камеру с одной, но я не уверен, помню ли я, позволяет ли она также выбирать файлы. Как я уже сказал, я спешу.

Мой настоящий вопрос, хотя, было ли это работать с PhoneGap Я создал тест, чтобы посмотреть, смогу ли я использовать Camera API и загрузить его в Parse. Для моего первого теста я решил просто использовать Base64. Это одна из опций в PhoneGap, и она работает также с Parse. Оказывается, это сработало очень просто. Я не буду беспокоиться о HTML, только о JavaScript, и я просто сосредоточусь на важной части.

    $("#takePicBtn").on("click", function(e) {
        e.preventDefault();
        navigator.camera.getPicture(gotPic, failHandler, {quality:50, destinationType:navigator.camera.DestinationType.DATA_URL, sourceType:navigator.camera.PictureSourceType.PHOTOLIBRARY});
               
    });
    
    function gotPic(data) {
        var parseFile = new Parse.File("mypic.jpg", {base64:data});
            parseFile.save().then(function() {
                navigator.notification.alert("Got it!", null);
                console.log("Ok");
                console.log(arguments.toString());
            }, function(error) {
                console.log("Error");
                console.log(error);
            });
        
    }

Опять же — я предполагаю, что все это довольно просто, но если это не имеет смысла, дайте мне знать. Я указал библиотеку фотографий во время тестирования на симуляторе iOS.

Woot. Так что это работает. Но — я слышал, что использование base64 для данных изображения в PhoneGap может потребовать немного больше памяти. Parse также поддерживает двоичный массив, поэтому я создал еще одну демонстрацию, в которой также используются «настоящие» файлы. Это оказалось немного сложнее.

Первое — PhoneGap может сохранить изображение с камеры в файловую систему. Эта часть проста. Но File API — не самая простая вещь для использования. API PhoneGap возвращает URI файла, который необходимо превратить в объект File, который затем необходимо отправить в устройство чтения файлов. Наконец, вы можете получить объект буфера массива, но вместо Parse нужен реальный массив. (И за эту часть я должен поблагодарить Си Робертсона за его помощь в G +.)

Вот код, который я использовал. Это не красиво. Но это работает.

function gotPic(data) {
        
    window.resolveLocalFileSystemURI(data, function(entry) {

        var reader = new FileReader();
            
        reader.onloadend = function(evt) {
            var byteArray = new Uint8Array(evt.target.result);
            var output = new Array( byteArray.length );
            var i = 0;
            var n = output.length;
            while( i < n ) {
                output[i] = byteArray[i];
                i++;
            }                
            var parseFile = new Parse.File("mypic.jpg", output);

            parseFile.save().then(function(ob) {
                    navigator.notification.alert("Got it!", null);
                    console.log(JSON.stringify(ob));
                }, function(error) {
                    console.log("Error");
                    console.log(error);
                });
                
        }
            
        reader.onerror = function(evt) {
              console.log('read error');
              console.log(JSON.stringify(evt));
          }
            
        entry.file(function(s) {
            reader.readAsArrayBuffer(s);
        }, function(e) {
            console.log('ee');
        });
            
    });
        
}

В любом случае — это очень круто и просто делает комбинацию Parse / PhoneGap еще круче. Я приложил копию своего кода с удаленными идентификаторами приложений. Наслаждайтесь!

Скачать прикрепленный файл