ng-upload를 사용하여 이미지를 업로드하는 AngularJS
Angular에서 파일을 업로드하려고 합니다.ng-upload를 사용하는 JS에 문제가 있습니다.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를 실행하면 폼 전체가 업로드된다는 것입니다.바람직한 행동은 아니지만 잘 해낼 수 있어요.js에서는 'completed' 파라미터가 true로 반환되는 경우에도 uploadPostImage의 'contents' 파라미터는 항상 정의되지 않습니다.
목표는 자르기용 이미지만 업로드하는 것입니다.이 프로세스에서 제가 뭘 잘못하고 있는 거죠?
파일 업로드 각도에 대한 문서는 거의 없습니다.많은 솔루션에서는 다른 의존관계(프라이머리에서의 jquery...)의 커스텀 디렉티브가 필요합니다.파일을 업로드 하는 것만으로...)여러 번 시도해 본 결과 angularjs(v.1.0.6에서 테스트됨)만으로 확인되었습니다.
html
<input type="file" name="file" onchange="angular.element(this).scope().uploadFile(this.files)"/>
Angularjs(1.0.6)는 "input-file" 태그의 ng-model을 지원하지 않으므로 선택한 모든 파일을 사용자로부터 전달하는 "native-way" 방식으로 수행해야 합니다.
컨트롤러
$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!... );
};
쿨한 부분은 정의되지 않은 content-type과 transformRequest: angular.identity입니다.이것에 의해, $http로 적절한 「content-type」을 선택해, 멀티파트 데이터를 처리할 때에 필요한 경계를 관리할 수 있게 됩니다.
ng-upload 대신 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', ['ngFileUpload']);
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 script, 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));
}).then(function(response) {
var data = response.data;
// file is uploaded successfully
console.log(data);
});
}
};
}];
위의 경우 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);
}
});
};
var app = angular.module('plunkr', [])
app.controller('UploadController', function($scope, fileReader) {
$scope.imageSrc = "";
$scope.$on("fileProgress", function(e, progress) {
$scope.progress = progress.loaded / progress.total;
});
});
app.directive("ngFileSelect", function(fileReader, $timeout) {
return {
scope: {
ngModel: '='
},
link: function($scope, el) {
function getFile(file) {
fileReader.readAsDataUrl(file, $scope)
.then(function(result) {
$timeout(function() {
$scope.ngModel = result;
});
});
}
el.bind("change", function(e) {
var file = (e.srcElement || e.target).files[0];
getFile(file);
});
}
};
});
app.factory("fileReader", function($q, $log) {
var onLoad = function(reader, deferred, scope) {
return function() {
scope.$apply(function() {
deferred.resolve(reader.result);
});
};
};
var onError = function(reader, deferred, scope) {
return function() {
scope.$apply(function() {
deferred.reject(reader.result);
});
};
};
var onProgress = function(reader, scope) {
return function(event) {
scope.$broadcast("fileProgress", {
total: event.total,
loaded: event.loaded
});
};
};
var getReader = function(deferred, scope) {
var reader = new FileReader();
reader.onload = onLoad(reader, deferred, scope);
reader.onerror = onError(reader, deferred, scope);
reader.onprogress = onProgress(reader, scope);
return reader;
};
var readAsDataURL = function(file, scope) {
var deferred = $q.defer();
var reader = getReader(deferred, scope);
reader.readAsDataURL(file);
return deferred.promise;
};
return {
readAsDataUrl: readAsDataURL
};
});
*************** CSS ****************
img{width:200px; height:200px;}
************** HTML ****************
<div ng-app="app">
<div ng-controller="UploadController ">
<form>
<input type="file" ng-file-select="onFileSelect($files)" ng-model="imageSrc">
<input type="file" ng-file-select="onFileSelect($files)" ng-model="imageSrc2">
<!-- <input type="file" ng-file-select="onFileSelect($files)" multiple> -->
</form>
<img ng-src="{{imageSrc}}" />
<img ng-src="{{imageSrc2}}" />
</div>
</div>
언급URL : https://stackoverflow.com/questions/17216806/angularjs-uploading-an-image-with-ng-upload
'programing' 카테고리의 다른 글
Angular 2 Form Group에서 모든 검증 오류를 가져옵니다. (0) | 2023.03.08 |
---|---|
변경의 원인이 되는 클릭 이벤트와 관련된 ng-repeat 항목을 애니메이션화하는 방법 (0) | 2023.03.08 |
임의의 JSON을 DOM에 삽입하기 위한 베스트 프랙티스 (0) | 2023.03.08 |
PHP json_encode 클래스 개인 구성원 (0) | 2023.03.08 |
브라우저 없이 Karma를 실행할 수 있습니까? (0) | 2023.03.08 |