2013-09-12 9 views
46

Привет, мне было интересно, есть ли способ предварительного просмотра изображений, прежде чем я загружу их с помощью angularjs? Я использую эту библиотеку. https://github.com/danialfarid/angular-file-uploadПредварительный просмотр изображения перед загрузкой Angularjs

Спасибо. Вот мой код:

template.html

<div ng-controller="picUploadCtr"> 
<form> 
     <input type="text" ng-model="myModelObj"> 
     <input type="file" ng-file-select="onFileSelect($files)" > 
<input type="file" ng-file-select="onFileSelect($files)" multiple> 

</form> 
    </div> 

controller.js

.controller('picUploadCtr', function($scope, $http,$location, userSettingsService) { 

$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]; 
    $http.uploadFile({ 
    url: 'server/upload/url', //upload.php script, node.js route, or servlet uplaod url) 
    data: {myObj: $scope.myModelObj}, 
    file: $file 
    }).then(function(data, status, headers, config) { 
    // file is uploaded successfully 
    console.log(data); 
    }); 
} 
} 
+0

http://www.angulartutorial.net/2017/02/show-preview-image-while-uploading.html – Prashobh

ответ

49

OdeToCode posted great service для этого материала. Так что с этой простой директивой вы можете легко просматривать и даже видеть прогресс бар:

.directive("ngFileSelect",function(){  
    return { 
    link: function($scope,el){   
     el.bind("change", function(e){   
     $scope.file = (e.srcElement || e.target).files[0]; 
     $scope.getFile(); 
     });   
    }   
    } 

Он работает во всех современных браузерах!

Пример: http://plnkr.co/edit/y5n16v?p=preview

+0

только заметить, что этот (отлично) решение, основанное на читателя файл API, который не поддерживает ie9 и ранние версии ie. – danikoren

+2

@saniko да. но благодаря богу, что его глобальное использование составляет всего 2,99% (http://caniuse.com/#feat=filereader) – Cherniv

+7

Я обновил этот вариант для работы с Angular 1.3 и немного упорядочил код http://plnkr.co/edit/JSuY2j? P = preview –

9

Смотрите изображения Загрузить виджет из Jasney extension of Bootstrap v3

+0

Я действительно ищу альтернативу Jasney Extension, так как вы не контролируете элементы предварительного просмотра и кнопок. Я хочу, чтобы мой предварительный просмотр отображался вдали от кнопки загрузки, но все они содержатся в одном контейнере. Считается, что это жизнеспособный вариант для большинства людей, и по этой причине я отвечу на ваш ответ. – dotnethaggis

32

JavaScript

$scope.setFile = function(element) { 
    $scope.currentFile = element.files[0]; 
    var reader = new FileReader(); 

    reader.onload = function(event) { 
    $scope.image_source = event.target.result 
    $scope.$apply() 

    } 
    // when the file is read it triggers the onload event above. 
    reader.readAsDataURL(element.files[0]); 
} 

Html

<img ng-src="{{image_source}}"> 
<input type="file" id="trigger" class="ng-hide" onchange="angular.element(this).scope().setFile(this)" accept="image/*"> 

Это сработало для меня.

+1

Почему это лучше, чем предыдущий ответ? – durron597

+3

Похоже, что это решение не требует использования https://github.com/ghostbar/angular-file-model –

+0

Здесь есть объяснение, почему это решение не является хорошей идеей: http://stackoverflow.com/ вопросы/17922557/angularjs-how-to-check-for-changes-in-file-input-fields/17923521 # 17923521 –

3
// start Picture Preview  
    $scope.imageUpload = function (event) { 
     var files = event.target.files; 

     for (var i = 0; i < files.length; i++) { 
      var file = files[i]; 
      var reader = new FileReader(); 
      reader.onload = $scope.imageIsLoaded; 
      reader.readAsDataURL(file); 
     } 
    } 

    $scope.imageIsLoaded = function (e) { 
     $scope.$apply(function() { 
      $scope.img = e.target.result;    
     }); 
    } 


<input type='file' ng-model-instant onchange="angular.element(this).scope().imageUpload(event)" /> 
<img class="thumb" ng-src="{{img}}" /> 
+0

Отлично! И если я хочу получить имя и расширение изображения, как я могу это сделать? – Patterson

Смежные вопросы