AngularJS Загрузка изображения с помощью ng-upload

Я пытаюсь загрузить файл в AngularJS, используя ng-upload, но у меня проблемы. Мой html выглядит так:

<div class="create-article" ng-controller="PostCreateCtrl">
        <form ng-upload method="post" enctype="multipart/form-data" action="/write" >
            <fieldset>
                <label>Category</label>
                <select name="category_id" class="">
                    <option value="0">Select A Category</option>
                    <?php foreach($categories as $category): ?>
                        <option value="<?= $category -> category_id; ?>"><?= $category -> category_name; ?></option>
                    <?php endforeach; ?>
                </select>

                <label>Title</label>
                <input type="text" class="title span5" name="post_title" placeholder="A catchy title here..." value="<?= $post -> post_title; ?>" />

                <label>Attach Image</label>
                <input type="file" name="post_image" />

                 <a href='javascript:void(0)'  class="upload-submit: uploadPostImage(contents, completed)" >Crop Image</a>

                <label>Body</label>
                <div id="container">
                <textarea id="mytextarea" wrap="off" name="post_content" class="span7" placeholder="Content..."><?= $post -> post_content; ?></textarea>
                </div>
                <div style='clear:both;'></div>
                <label>Preview</label>
                <div id='textarea-preview'></div>

            </fieldset>
            <div class="span7" style="margin: 0;">
                <input type="submit" class="btn btn-success" value="Create Post" />
            <input type="submit" class="btn btn-warning pull-right draft" value="Save as Draft" />
            </div>

        </form>
    </div>

И мой контроллер js выглядит следующим образом:

ClabborApp.controller("PostCreateCtrl", ['$scope', 'PostModel',
function($scope, PostModel) {

    $scope.uploadPostImage = function(contents, completed) {
        console.log(completed);
        alert(contents);
    }

}]);

Проблема, с которой я сталкиваюсь, - это когда изображение обрезается, и он выполняет uploadPostImage, он загружает всю форму. Нежелательное поведение, но я могу заставить его работать. Большая проблема заключается в том, что функция uploadPostImage "content" всегда имеет значение "w90", даже когда параметр "завершен" возвращается как истинный.

Цель состоит только в загрузке изображения для обрезки. Что я делаю неправильно в этом процессе?

Ответ 1

Документация по angular для загрузки файлов отсутствует. Множество решений требуют настраиваемых директив других зависимостей (jquery в primis... просто для загрузки файла...). После многих попыток я нашел это с помощью только angularjs (проверено на v.1.0.6)

HTML

<input type="file" name="file" onchange="angular.element(this).scope().uploadFile(this.files)"/>

Angularjs (1.0.6) не поддерживает ng-модель в тегах "входного файла", поэтому вам нужно сделать это с помощью "нативного" способа, который передает все (в конечном итоге) выбранные файлы от пользователя.

контроллер

$scope.uploadFile = function(files) {
    var fd = new FormData();
    //Take the first selected file
    fd.append("file", files[0]);

    $http.post(uploadUrl, fd, {
        withCredentials: true,
        headers: {'Content-Type': undefined },
        transformRequest: angular.identity
    }).success( ...all right!... ).error( ..damn!... );

};

Классная часть - это тип контента undefined и идентификатор transformRequest: angular., которые дают при $http возможность выбора правильного "типа контента" и управления границей, необходимой при обработке многостраничных данных.

Ответ 2

Вы можете попробовать ng-file-upload плагин angularjs.

Это довольно легко настроить и разобраться с деталями angularjs. Он также поддерживает прогресс, отмену, перетаскивание и перекрестный браузер.

HTML

<!-- Note: MUST BE PLACED BEFORE angular.js-->
<script src="ng-file-upload-shim.min.js"></script> 
<script src="angular.min.js"></script>
<script src="ng-file-upload.min.js"></script> 

<div ng-controller="MyCtrl">
  <input type="file" ngf-select="onFileSelect($files)" multiple>
</div>

JS:

//inject angular file upload directives and service.
angular.module('myApp', ['angularFileUpload']);

var MyCtrl = [ '$scope', '$upload', function($scope, $upload) {
  $scope.onFileSelect = function($files) {
    //$files: an array of files selected, each file has name, size, and type.
    for (var i = 0; i < $files.length; i++) {
      var file = $files[i];
      $scope.upload = $upload.upload({
        url: 'server/upload/url', //upload.PHP скрипт, node.js route, or servlet url
        data: {myObj: $scope.myModelObj},
        file: file,
      }).progress(function(evt) {
        console.log('percent: ' + parseInt(100.0 * evt.loaded / evt.total));
      }).success(function(data, status, headers, config) {
        // file is uploaded successfully
        console.log(data);
      });
    }
  };
}];

Ответ 3

Ошибка при загрузке файла: "контейнер не имеет метода обработки POST"

App.service('fileUpload', ['$http', function($http) {
    this.uploadFileToUrl = function(file, uploadUrl) {
        console.log("inside upload file service js ");
        var fd = new FormData();
        fd.append('file', file);

        $http.post(uploadUrl, fd, {
                transformRequest: angular.identity,
                headers: {
                    'Content-Type': undefined
                }
            })
            .success(function(response) {

                console.log("file uploaded sucessfully " + response);

            })
            .error(function(error) {

                console.log("Error while uploading file " + JSON.stringify(error));
            });
    }
}]);

{ "error": { "name": "Error", "status": 404, "message": "Shared class \" container\ "не имеет метода обработки POST/5555-1111", "statusCode": 404, "стек": "Ошибка:

Ответ 4

В моем случае вышеупомянутые методы работают нормально с php, но когда я пытаюсь загрузить файлы с этими методами в node.js, то у меня есть некоторые проблемы. Поэтому вместо использования $http ({..,..,...}) используйте обычный jQuery ajax.

Для выбора файла используйте этот

<input type="file" name="file" onchange="angular.element(this).scope().uploadFile(this)"/>

И в контроллере

$scope.uploadFile = function(element) {   
var data = new FormData();
data.append('file', $(element)[0].files[0]);
jQuery.ajax({
      url: 'brand/upload',
      type:'post',
      data: data,
      contentType: false,
      processData: false,
      success: function(response) {
      console.log(response);
      },
      error: function(jqXHR, textStatus, errorMessage) {
      alert('Error uploading: ' + errorMessage);
      }
 });   
};