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

Загрузка файлов в приложение Ionic с использованием веб-API

Моя проблема следующая.

Я дал WEB API, где мне нужно добавить изображение досок.

Что мне нужно делать?

  • Пользователь может выбрать Изображение с телефона
  • Пользователь может добавить Имя платы
  • Когда пользователь нажимает кнопку "Отправить", введенное имя платы и изображение на плате должны публиковаться с использованием Web API с помощью метода PUT. Ниже приведена информация о веб-интерфейсе.

Сведения о веб-интерфейсе

Заголовок

Данные

  • board_id: 321
  • board_title: | Название |
  • board_background: | Файл |

Я использовал плагин cordovaImagePicker, чтобы выбрать изображение, а затем я зациклился на его загрузке на сервер.

Я могу использовать плагин переноса файлов cordova, но я думаю, что это не поможет мне в этом случае, так как нет определенного места для хранения изображения. Все управление файлами, выполненное WEB API, мы должны просто отправить файл с данными.

4b9b3361

Ответ 1

После многократного решения я пришел с нижеприведенным ответом.

Board.html

    <ion-view>
        <ion-nav-bar class="bar">
            <ion-nav-title>
                <h1 class="title">
                    Create Board
                </h1>
            </ion-nav-title>
        </ion-nav-bar>
        <form name="boardForm" ng-submit="addBoard(data)">
            <ion-content padding="false" scroll="true" has-bouncing="false">
                <div id="form">
                    <div style="text-align: center; padding-top: 2%; padding-bottom: 2%;">
                        <div id="image-preview">
                            <label for="image-upload" id="image-label"><img src="{{ImagePrefix}}/task_plus.png" alt=""/></label>
                            <input type="file" name="board_background" id="image-upload" file-model="data.board_background">
                        </div>
                        <p>Add Cover</p>
                    </div>
                    <ion-list>
                        <ion-item style="background-color: #F8F8F8;">
                            <label class="control-label" for="board_name">BOARD NAME</label>
                        </ion-item>
                        <ion-item ng-class="{true:'error'}[submitted && boardForm.board_title.$invalid]">
                            <input type="text" id="board_name" ng-model="data.board_title"
                                   placeholder="Add a Name" name="board_title" required>

                            <p ng-show="submitted && boardForm.board_title.$error.required">
                                Please enter a board name
                            </p>
                        </ion-item>
                    </ion-list>
                </div>
            </ion-content>
            <ion-footer-bar>
                <button class="button button-block control-button bottomOfPage"
                        ng-click="submitted = true">
                    CREATE
                </button>
            </ion-footer-bar>
        </form>
    </ion-view>

директива

    .directive('fileModel', ['$parse', function ($parse) {
            return {
                restrict: 'A',
                link: function (scope, element, attrs) {
                    var model = $parse(attrs.fileModel);
                    var modelSetter = model.assign;

                    element.bind('change', function () {
                        scope.$apply(function () {
                            modelSetter(scope, element[0].files[0]);
                        });
                    });
                }
            };
        }])

контроллер

    .controller('ManageBoardCtrl', function ($scope, $http, $ionicPopup, $state, BoardService) {
            $scope.submitted = false;
            $scope.data = {};
            $scope.addBoard = function(formData) {
                BoardService.CreateBoard(formData).then(function(response) {
                    if (response === "success") {
                        $ionicPopup.alert({
                            title: "Success",
                            template: "Board created successfully"
                        });
                    }
                }, function (response) {
                    $ionicPopup.alert({
                        title: "Failed",
                        template: "Somethings wrong, Can not create boards at now."
                    });
                });
            }
        })

Сервис

    .service('BoardService', function ($q, $http) {
            var getUrl = API_URL + "boards";

            var createBoard = function (fData) {
                var formData = new FormData();
                formData.append("board_title", fData.board_title);
                formData.append("board_background", fData.board_background);

                return $q(function (resolve, reject) {
                    $http({
                        transformRequest: angular.identity,
                        method: 'POST',
                        url: getUrl,
                        headers: { 'Content-Type': undefined },
                        data: formData
                    }).success(function (response) {
                        if (response.success === true) {
                            resolve('success');
                        } else {
                            reject('fail');
                        }
                    }).error(function () {
                        reject('requesterror');
                    });
                });
            };

            return {
                CreateBoard: createBoard
            };
        })

После развертывания приложения для выбора файла android/iPhone будет обрабатываться просмотр изображений на основе ОС.

Ответ 2

Одна простая вещь, которую я могу предложить,

Используйте тег ввода [ "file" ], чтобы выбрать изображение. Вы получите файл-объект и временный URL-адрес. с этим URL-адресом вы можете показать изображение в форме.

Затем используйте formData для добавления изображения и другого поля.

например.

 var fd = new FormData();
 fd.append('board_background', $scope.image, $scope.image.name);
 fd.append('board_id', 321);
 fd.append('board_title', 'Dummy title');

 var xhr = new XMLHttpRequest();
 xhr.open('PUT', YOUR_URL, true);

 xhr.onload(function(res){
    // Write your callback here.
 });

 // Send the Data.
 xhr.send(fd);

Надеюсь, это поможет вам и выполнит ваши требования.

Ответ 4

Прежде всего, нужно выбрать изображение с устройства.

vm.getImages = function () {
            var options = {
                quality: 70,
                destinationType: Camera.DestinationType.DATA_URL,
                sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
                allowEdit: true,
                correctOrientation:true,
                encodingType: Camera.EncodingType.JPEG,
                targetWidth: 300,
                popoverOptions: CameraPopoverOptions,
                saveToPhotoAlbum: true
            };

            navigator.camera.getPicture(onSuccess, onFail, options);

            function onSuccess(imageURI) {                
                vm.image = "data:image/jpeg;base64," + imageURI;
                vm.imageURI = imageURI;
            }

            function onFail(message) {                
                console.log('Failed because: ' + message);
            }
        };

При необходимости вы можете изменить тип источника ввода.

sourceType: Camera.PictureSourceType.CAMERA,

В случае успеха вы получаете ImageURI либо напрямую, либо конвертируете его в base64, как указано ниже для загрузки.

vm.image = "data:image/jpeg;base64," + imageURI;

После этого вы можете использовать FileTransfer плагин для загрузки файла и отслеживания прогресса в то же время.

cordovaFileTransfer.upload()
                .then(function (result) {},
                  function (err) {},
                  function (progress) {});