Завантаження файлів за допомогою AngularJS


296

Ось моя форма HTML:

<form name="myForm" ng-submit="">
    <input ng-model='file' type="file"/>
    <input type="submit" value='Submit'/>
</form>

Я хочу завантажити зображення з локальної машини і хочу прочитати вміст завантаженого файлу. Все це я хочу зробити за допомогою AngularJS.

Коли я намагаюся надрукувати значення, $scope.fileвоно стає невизначеним.



Відповіді:


344

Деякі відповіді тут пропонують використовувати FormData(), але, на жаль, це об’єкт браузера, недоступний в Internet Explorer 9 і нижче. Якщо вам потрібно підтримати ці старі веб-переглядачі, вам знадобиться стратегія резервного копіювання, наприклад використання <iframe>або Flash.

Уже існує багато модулів Angular.js для завантаження файлів. Ці два мають явну підтримку для старих браузерів:

І деякі інші варіанти:

Одне з них повинно відповідати вашому проекту або може дати вам деяке уявлення про те, як його кодувати самостійно.


4
Ще одне рішення (IaaS для завантаження файлів): github.com/uploadcare/angular-uploadcare
David Avsajanishvili

27
EggHead має гарне відео про це - egghead.io/lessons/angularjs-file-uploads
Адам Зернер

2
danialfarid / angular-file-upload перейменовано на ng-file-upload
Michael

5
3 роки відповідь. IE 9 - DEAD зараз у 2016 році.
user2404597

5
Я думаю, вам слід оновити свою відповідь, щоб мати правильне рішення, а не вказувати на посилання. Це спосіб переповнення стека. Інакше просто зробіть це як коментар.
Алекс Рейнольдс

178

Найпростіше використовувати HTML5 API, а саме FileReader

HTML досить простий:

<input type="file" id="file" name="file"/>
<button ng-click="add()">Add</button>

У контролері визначте метод "додати":

$scope.add = function() {
    var f = document.getElementById('file').files[0],
        r = new FileReader();

    r.onloadend = function(e) {
      var data = e.target.result;
      //send your binary data via $http or $resource or do anything else with it
    }

    r.readAsBinaryString(f);
}

Сумісність браузера

Настільні браузери

Edge 12, Firefox (Gecko) 3.6 (1.9.2), Chrome 7, Opera * 12.02, Safari 6.0.2

Мобільні браузери

Firefox (Gecko) 32, Chrome 3, Opera * 11.5, Safari 6.1

Примітка: метод readAsBinaryString () застарілий, а замість нього слід використовувати readAsArrayBuffer () .


10
FileReader - це клас зі стандартного API файлу HTML5 w3.org/TR/FileAPI . Це дозволяє читати дані з файлу, вказаного у вхідному HTML-елементі, та обробляти його всередині onloadendфункції зворотного виклику. Вам не потрібна бібліотека, щоб використовувати цей API, його вже є у вашому браузері (якщо ви не використовуєте дуже старий). Сподіваюсь, це допомагає.
яггер

15
За станом на 12 липня 2012 року робочий проект W3C від FileReader.readAsBinaryString застарілий.
Шейн Стиллвелл

13
Ви не повинні мати доступ до DOM з кутовим. Це дуже погана практика.
jeanmatthieud

9
@Siderex, не в контролері, але це абсолютно здорово, щоб зробити це з директиви. Насправді саме для цього і є директива. Ви можете прочитати про це у кутових docs.angularjs.org/guide/directive
yagger

1
@yagger Чи є певна причина, чому ваші посилання посилаються на readAsArrayBufferметод FileReaderSync (які доступні лише у веб-службовців) замість звичайного, асинхронного API FileReader ?
doldt

58

Це сучасний спосіб браузера, без сторонніх бібліотек. Працює над усіма останніми браузерами.

 app.directive('myDirective', function (httpPostFactory) {
    return {
        restrict: 'A',
        scope: true,
        link: function (scope, element, attr) {

            element.bind('change', function () {
                var formData = new FormData();
                formData.append('file', element[0].files[0]);
                httpPostFactory('upload_image.php', formData, function (callback) {
                   // recieve image name to use in a ng-src 
                    console.log(callback);
                });
            });

        }
    };
});

app.factory('httpPostFactory', function ($http) {
    return function (file, data, callback) {
        $http({
            url: file,
            method: "POST",
            data: data,
            headers: {'Content-Type': undefined}
        }).success(function (response) {
            callback(response);
        });
    };
});

HTML:

<input data-my-Directive type="file" name="file">

PHP:

if (isset($_FILES['file']) && $_FILES['file']['error'] == 0) {

// uploads image in the folder images
    $temp = explode(".", $_FILES["file"]["name"]);
    $newfilename = substr(md5(time()), 0, 10) . '.' . end($temp);
    move_uploaded_file($_FILES['file']['tmp_name'], 'images/' . $newfilename);

// give callback to your angular code with the image src name
    echo json_encode($newfilename);
}

js fiddle (тільки передній) https://jsfiddle.net/vince123/8d18tsey/31/


Як би ви отримали файл у вузлі?
Соковитий

Будь-які деталі? Вам потрібна ng-submitдія чи форма? Це само по собі нічого не робить
Арон

@Emaborsa привіт Я додав jsfiddle і зробив більш повний приклад php-коду. Він подає зображення після того, як значення вхідного файлу змінилося, тому не потрібно ng-submit.
Вінс Верховен

Ідеальне найпростіше рішення, але мені знадобилися віки, щоб розробити, як змусити мої послуги WCF впоратися з завантаженими даними. Це життєво важливо , що ви берете на себе потік даних, і передати його через що - щось на зразок MultiParser насправді читати в даному файл: stackoverflow.com/a/23702692/391605 В іншому випадку ви будете зберігати сирі байти «------ WebKitFormBoundary Зміст-диспозиція: ... тощо. "
Майк Гледхілл

Мені потрібно було додати властивість 'transformRequest: angular.identity' до об’єкта $ http запиту, як показав Manoy Ojha a litle далі, інакше тип Content-Content не буде встановлений належним чином, і приклад не працює.
Грегор Славець

38

Нижче працює приклад завантаження файлів:

http://jsfiddle.net/vishalvasani/4hqVu/

У цьому одна функція називається

setFiles

З View, який оновить масив файлів у контролері

або

Ви можете перевірити завантаження файлу jQuery за допомогою AngularJS

http://blueimp.github.io/jQuery-File-Upload/angularjs.html


Привіт, я шукав щось, через що я можу просто завантажити один файл і відобразити трохи нижче нього. Однак у вашому прикладі я не зміг цього зробити. Не майте уваги, але я новачок у цьому куточку, і я маю намір навчитися робити цю мету більш простим, але надійним способом.
Aditya Sethi

Це дуже допомогло. Дякую!
RachelD

Відмінний приклад без використання додаткової бібліотеки / розширення. Дякую.
markdsievers

4
Дуже корисно, лише примітка .. тут використовується файл API, який не працює в IE9 або нижче.
ArjaaAine

Будь-яка ідея, як я отримую помилки в результаті? Сервер може призвести до помилки, і я хотів би показати це повідомлення про помилку ...
CularBytes

17

Ви можете досягти гарного файл і папку для завантаження з допомогою flow.js .

https://github.com/flowjs/ng-flow

Ознайомтеся з демонстрацією тут

http://flowjs.github.io/ng-flow/

Він не підтримує IE7, IE8, IE9, тому з часом вам доведеться використовувати рівень сумісності

https://github.com/flowjs/fusty-flow.js


`flow.js 'є фантастичним, але документації поки недостатньо. Мені потрібно маніпулювати одним завантаженням і додати попередній перегляд, а також надіслати кнопку події окремо, але я не знаю, як це зробити.
Френсіс Родрігес

14

Використовуйте onchangeподію, щоб передати елемент вхідного файлу вашій функції.

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

Отже, коли користувач вибирає файл, ви маєте посилання на нього, не потребуючи натискання кнопки «Додати» або «Завантажити».

$scope.fileSelected = function (element) {
    var myFileSelected = element.files[0];
};

2
Це працює не так, як бажано. Це мій робочий процес: 1. Оновіть сторінку 2. Додати новий файл. ** Перший доданий файл завжди не визначений. ** 3. Додайте інший файл. Відтепер кожен завантажений файл - це попередній файл, який я додав. Отже, для другого доданого мною файлу він би завантажив перший файл, який я додав (який фактично не вдався)
Pulkit Pahwa

1
найкращий метод!
Степан Яковенко

11

Я спробував усі альтернативи, які дає @Anoyz (Правильна відповідь) ... і найкращим рішенням є https://github.com/danialfarid/angular-file-upload

Деякі особливості:

  • Прогрес
  • Мультифайли
  • Поля
  • Старі браузери (IE8-9)

Для мене це добре працює. Вам просто потрібно звернути увагу на інструкції.

На стороні сервера я використовую проміжне програмне забезпечення NodeJs, Express 4 та Multer для керування запитом з кількома частинами.


Як ви показуєте зображення? З бекенда вони успішно заходять, але вони зберігаються як nlzt9LJWRrAZEO3ZteZUOgGcформат .png, але без них. Як додати це?
Сарас Ар’я

9

HTML

<html>
    <head></head>

<body ng-app = "myApp">

  <form ng-controller = "myCtrl">
     <input type = "file" file-model="files" multiple/>
     <button ng-click = "uploadFile()">upload me</button>
     <li ng-repeat="file in files">{{file.name}}</li>
  </form>

Сценарії

  <script src = 
     "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
  <script>
    angular.module('myApp', []).directive('fileModel', ['$parse', function ($parse) {
        return {
           restrict: 'A',
           link: function(scope, element, attrs) {
              element.bind('change', function(){
              $parse(attrs.fileModel).assign(scope,element[0].files)
                 scope.$apply();
              });
           }
        };
     }]).controller('myCtrl', ['$scope', '$http', function($scope, $http){


       $scope.uploadFile=function(){
       var fd=new FormData();
        console.log($scope.files);
        angular.forEach($scope.files,function(file){
        fd.append('file',file);
        });
       $http.post('http://localhost:1337/mediaobject/upload',fd,
           {
               transformRequest: angular.identity,
               headers: {'Content-Type': undefined}                     
            }).success(function(d)
                {
                    console.log(d);
                })         
       }
     }]);

  </script>


9

<input type=file>Елемент не за замовчуванням робота з директивою нг-моделі . Для цього потрібна спеціальна директива :

Робоча демонстрація select-ng-filesдирективи, яка працює з ng-model1

angular.module("app",[]);

angular.module("app").directive("selectNgFiles", function() {
  return {
    require: "ngModel",
    link: function postLink(scope,elem,attrs,ngModel) {
      elem.on("change", function(e) {
        var files = elem[0].files;
        ngModel.$setViewValue(files);
      })
    }
  }
});
<script src="//unpkg.com/angular/angular.js"></script>
  <body ng-app="app">
    <h1>AngularJS Input `type=file` Demo</h1>
    
    <input type="file" select-ng-files ng-model="fileList" multiple>
    
    <h2>Files</h2>
    <div ng-repeat="file in fileList">
      {{file.name}}
    </div>
  </body>


$http.postіз списку файлів

$scope.upload = function(url, fileList) {
    var config = { headers: { 'Content-Type': undefined },
                   transformResponse: angular.identity
                 };
    var promises = fileList.map(function(file) {
        return $http.post(url, file, config);
    });
    return $q.all(promises);
};

При надсиланні POST з об’єктом File важливо встановити 'Content-Type': undefined. Потім метод відправки XHR виявить об'єкт File і автоматично встановить тип вмісту.


7

Легко з директивою

Html:

<input type="file" file-upload multiple/>

JS:

app.directive('fileUpload', function () {
return {
    scope: true,        //create a new scope
    link: function (scope, el, attrs) {
        el.bind('change', function (event) {
            var files = event.target.files;
            //iterate files since 'multiple' may be specified on the element
            for (var i = 0;i<files.length;i++) {
                //emit event upward
                scope.$emit("fileSelected", { file: files[i] });
            }                                       
        });
    }
};

У директиві ми гарантуємо, що створено нову область, а потім слухаємо зміни, внесені до елемента введення файлу. Коли виявляються зміни, випромінюйте подію на всі області предків (вгору) з файловим об'єктом як параметр.

У вашому контролері:

$scope.files = [];

//listen for the file selected event
$scope.$on("fileSelected", function (event, args) {
    $scope.$apply(function () {            
        //add the file object to the scope's files collection
        $scope.files.push(args.file);
    });
});

Потім у вашому дзвінку Ajax:

data: { model: $scope.model, files: $scope.files }

http://shazwazza.com/post/uploading-files-and-json-data-in-the-same-request-with-angular-js/


7

Я думаю, що це кутове завантаження файлів:

ng-file-upload

Легка кутова директива JS для завантаження файлів.

Ось це DEMO page.Features

  • Підтримує хід завантаження, скасовує / скасовує завантаження під час виконання, перетягування файлів (html5), перетягування каталогів (webkit), методи CORS, PUT (html5) / POST, перевірка типу та розміру файлу, показ попереднього перегляду вибраних зображень / аудіо / відео.
  • Перехресне завантаження файлів у браузері та FileReader (HTML5 та не HTML5) за допомогою Flash polyfill FileAPI. Дозволяє перевірити / змінити сторону клієнта перед завантаженням файлу
  • Пряме завантаження в db-сервіси CouchDB, imgur тощо ... з типом вмісту файлу за допомогою Upload.http (). Це дозволяє подія прогресу для кутових запитів http POST / PUT.
  • Окремий файл shim, файли FileAPI завантажуються на вимогу для коду, що не є HTML5, тобто не вимагає додаткового завантаження / коду, якщо вам просто потрібна підтримка HTML5.
  • Легкий, використовуючи звичайний $ http для завантаження (із кришкою для браузерів, що не HTML5), тому всі кутові функції $ http доступні

https://github.com/danialfarid/ng-file-upload


6

Одночасно завантажується ваш файл та дані json.

// FIRST SOLUTION
 var _post = function (file, jsonData) {
            $http({
                url: your url,
                method: "POST",
                headers: { 'Content-Type': undefined },
                transformRequest: function (data) {
                    var formData = new FormData();
                    formData.append("model", angular.toJson(data.model));
                    formData.append("file", data.files);
                    return formData;
                },
                data: { model: jsonData, files: file }
            }).then(function (response) {
                ;
            });
        }
// END OF FIRST SOLUTION

// SECOND SOLUTION
// If you can add plural file and  If above code give an error.
// You can try following code
 var _post = function (file, jsonData) {
            $http({
                url: your url,
                method: "POST",
                headers: { 'Content-Type': undefined },
                transformRequest: function (data) {
                    var formData = new FormData();
                    formData.append("model", angular.toJson(data.model));
                for (var i = 0; i < data.files.length; i++) {
                    // add each file to
                    // the form data and iteratively name them
                    formData.append("file" + i, data.files[i]);
                }
                    return formData;
                },
                data: { model: jsonData, files: file }
            }).then(function (response) {
                ;
            });
        }
// END OF SECOND SOLUTION


4

Ви можете використовувати FormDataбезпечний та швидкий об'єкт:

// Store the file object when input field is changed
$scope.contentChanged = function(event){
    if (!event.files.length)
        return null;

    $scope.content = new FormData();
    $scope.content.append('fileUpload', event.files[0]); 
    $scope.$apply();
}

// Upload the file over HTTP
$scope.upload = function(){
    $http({
        method: 'POST', 
        url: '/remote/url',
        headers: {'Content-Type': undefined },
        data: $scope.content,
    }).success(function(response) {
        // Uploading complete
        console.log('Request finished', response);
    });
}

Чи можете ви пояснити, де саме використовується "contentChanged"?
Марк Дж. Шмідт

Коли введення файлу зміниться, запуск цієї функції розпочне процес завантаження.
Farsheed

1
Оскільки немає <input type="file" ng-change="contentChanged($event)">, як це зробити?
Марк Дж. Шмідт

3

http://jsfiddle.net/vishalvasani/4hqVu/ прекрасно працює в хромі та IE (якщо ви трохи оновите CSS у фоновому зображенні). Це використовується для оновлення панелі прогресу:

 scope.progress = Math.round(evt.loaded * 100 / evt.total)

але у [відсотках] даних кутового FireFox дані в DOM не оновлюються успішно, хоча файли завантажуються успішно.


Для FF ви можете прослухати loadподію, і якщо довжина обчислюється, тоді запустіть подію прогресу, щоб вказати на успішне завантаження. github.com/danialfarid/angular-file-upload вже піклується про це.
danial

Він є, але в даній скрипці також перевіряється і застосовується. Все ще немає надії на ФФ.
mayankcpdixit

Я думаю, якщо ви просто зателефонуєте uploadProgress inside uploadComplete, він повинен працювати для FF
Danial

Ні, це не так, і навіть якщо це так, чи можете ви пояснити, чому? Я даю посилання на скрипку у своєму дописі. Якщо це можливо, чи можете ви оновити його до роботи у FF та посилання рішення щодо коментарів тут?
mayankcpdixit

Яка версія Firefox?
danial

3

Ви можете розглянути IaaS для завантаження файлів, таких як Uploadcare . Для нього є кутовий пакет: https://github.com/uploadcare/angular-uploadcare

Технічно він реалізований як директива, надаючи різні варіанти завантаження та маніпуляції з завантаженими зображеннями у віджеті:

<uploadcare-widget
  ng-model="object.image.info.uuid"
  data-public-key="YOURKEYHERE"
  data-locale="en"
  data-tabs="file url"
  data-images-only="true"
  data-path-value="true"
  data-preview-step="true"
  data-clearable="true"
  data-multiple="false"
  data-crop="400:200"
  on-upload-complete="onUCUploadComplete(info)"
  on-widget-ready="onUCWidgetReady(widget)"
  value="{{ object.image.info.cdnUrl }}"
 />

Більше варіантів конфігурації, з якими можна грати: https://uploadcare.com/widget/configure/


3

Я знаю, що це пізній запис, але я створив просту директиву щодо завантаження. Над яким ви зможете працювати за короткий час!

<input type="file" multiple ng-simple-upload web-api-url="/api/Upload" callback-fn="myCallback" />

ng-simple - завантажуйте більше на Github із прикладом за допомогою Web API.


3

HTML

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

додати метод "profileimage ()" до свого контролера

    $scope.profileimage = function(selectimage) {
      console.log(selectimage.files[0]);
 var selectfile=selectimage.files[0];
        r = new FileReader();
        r.onloadend = function (e) {
            debugger;
            var data = e.target.result;

        }
        r.readAsBinaryString(selectfile);
    }

2

Це має бути оновлення / коментар до відповіді @ jquery-гуру, але оскільки мені не вистачає реп, воно піде сюди. Він виправляє помилки, які тепер генеруються кодом.

https://jsfiddle.net/vzhrqotw/

Зміни в основному:

FileUploadCtrl.$inject = ['$scope']
function FileUploadCtrl(scope) {

До:

app.controller('FileUploadCtrl', function($scope)
{

Не соромтеся перейти до більш підходящого місця за бажанням.


2

Я прочитав всю нитку, і рішення HTML5 API виглядало найкраще. Але це змінює мої бінарні файли, пошкоджуючи їх таким чином, як я не досліджував. Рішення, яке для мене прекрасно працювало:

HTML:

<input type="file" id="msds" ng-model="msds" name="msds"/>
<button ng-click="msds_update()">
    Upload
</button>

JS:

msds_update = function() {
    var f = document.getElementById('msds').files[0],
        r = new FileReader();
    r.onloadend = function(e) {
        var data = e.target.result;
        console.log(data);
        var fd = new FormData();
        fd.append('file', data);
        fd.append('file_name', f.name);
        $http.post('server_handler.php', fd, {
            transformRequest: angular.identity,
            headers: {'Content-Type': undefined}
        })
        .success(function(){
            console.log('success');
        })
        .error(function(){
            console.log('error');
        });
    };
    r.readAsDataURL(f);
}

Сторона сервера (PHP):

$file_content = $_POST['file'];
$file_content = substr($file_content,
    strlen('data:text/plain;base64,'));
$file_content = base64_decode($file_content);

1

Я можу завантажувати файли за допомогою AngularJS за допомогою наведеного нижче коду:

fileДля аргументу , який повинен бути переданий для функції ngUploadFileUploadє $scope.fileвідповідно з вашим питанням.

Ключовим моментом тут є використання transformRequest: []. Це не дозволить $ http зіпсуватись із вмістом файлу.

       function getFileBuffer(file) {
            var deferred = new $q.defer();
            var reader = new FileReader();
            reader.onloadend = function (e) {
                deferred.resolve(e.target.result);
            }
            reader.onerror = function (e) {
                deferred.reject(e.target.error);
            }

            reader.readAsArrayBuffer(file);
            return deferred.promise;
        }

        function ngUploadFileUpload(endPointUrl, file) {

            var deferred = new $q.defer();
            getFileBuffer(file).then(function (arrayBuffer) {

                $http({
                    method: 'POST',
                    url: endPointUrl,
                    headers: {
                        "accept": "application/json;odata=verbose",
                        'X-RequestDigest': spContext.securityValidation,
                        "content-length": arrayBuffer.byteLength
                    },
                    data: arrayBuffer,
                    transformRequest: []
                }).then(function (data) {
                    deferred.resolve(data);
                }, function (error) {
                    deferred.reject(error);
                    console.error("Error", error)
                });
            }, function (error) {
                console.error("Error", error)
            });

            return deferred.promise;

        }

0

Вище прийнята відповідь не підтримує браузер. Якщо у когось із проблем із сумісністю, спробуйте це.

Скрипка

Переглянути код

 <div ng-controller="MyCtrl">
      <input type="file" id="file" name="file"/>
      <br>
      <button ng-click="add()">Add</button>
      <p>{{data}}</p>
    </div>

Код контролера

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.data = 'none';    
    $scope.add = function(){
      var f = document.getElementById('file').files[0],
          r = new FileReader();
      r.onloadend = function(e){        
          var binary = "";
var bytes = new Uint8Array(e.target.result);
var length = bytes.byteLength;

for (var i = 0; i < length; i++) 
{
    binary += String.fromCharCode(bytes[i]);
}

$scope.data = (binary).toString();

          alert($scope.data);
      }
      r.readAsArrayBuffer(f);
    }
}

0

простими словами

в Html - додайте лише код нижче

     <form name="upload" class="form" data-ng-submit="addFile()">
  <input type="file" name="file" multiple 
 onchange="angular.element(this).scope().uploadedFile(this)" />
 <button type="submit">Upload </button>
</form>

в контролері - Ця функція викликається при натисканні кнопки "Завантажити файл" . він завантажить файл. ви можете втішити це.

$scope.uploadedFile = function(element) {
$scope.$apply(function($scope) {
  $scope.files = element.files;         
});
}

додайте більше в контролери - нижче код додайте у функцію. Ця функція викликається при натисканні на кнопку, яка використовується "натисканням на api (POST)" . він надішле файл (який завантажив) та форми форми в бекенд.

var url = httpURL + "/reporttojson"
        var files=$scope.files;

         for ( var i = 0; i < files.length; i++)
         {
            var fd = new FormData();
             angular.forEach(files,function(file){
             fd.append('file',file);
             });
             var data ={
              msg : message,
              sub : sub,
              sendMail: sendMail,
              selectUsersAcknowledge:false
             };

             fd.append("data", JSON.stringify(data));
              $http.post(url, fd, {
               withCredentials : false,
               headers : {
                'Content-Type' : undefined
               },
             transformRequest : angular.identity
             }).success(function(data)
             {
                  toastr.success("Notification sent successfully","",{timeOut: 2000});
                  $scope.removereport()
                   $timeout(function() {
                    location.reload();
                }, 1000);

             }).error(function(data)
             {
              toastr.success("Error in Sending Notification","",{timeOut: 2000});
              $scope.removereport()
             });
        }

в цьому випадку .. я додав нижче код як дані форми

var data ={
          msg : message,
          sub : sub,
          sendMail: sendMail,
          selectUsersAcknowledge:false
         };

0
<form id="csv_file_form" ng-submit="submit_import_csv()" method="POST" enctype="multipart/form-data">
    <input ng-model='file' type="file"/>
    <input type="submit" value='Submit'/>
</form>

У кутовому JS-контролері

$scope.submit_import_csv = function(){

        var formData = new FormData(document.getElementById("csv_file_form"));
        console.log(formData);

        $.ajax({
            url: "import",
            type: 'POST',
            data:  formData,
            mimeType:"multipart/form-data",
            contentType: false,
            cache: false,
            processData:false,
            success: function(result, textStatus, jqXHR)
            {
            console.log(result);
            }
        });

        return false;
    }

0

Ми використовували HTML, CSS та AngularJS. Наступний приклад показує, як завантажити файл за допомогою AngularJS.

<html>

   <head>
      <script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
   </head>

   <body ng-app = "myApp">

      <div ng-controller = "myCtrl">
         <input type = "file" file-model = "myFile"/>
         <button ng-click = "uploadFile()">upload me</button>
      </div>

      <script>
         var myApp = angular.module('myApp', []);

         myApp.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]);
                     });
                  });
               }
            };
         }]);

         myApp.service('fileUpload', ['$http', function ($http) {
            this.uploadFileToUrl = function(file, uploadUrl){
               var fd = new FormData();
               fd.append('file', file);

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

               .success(function(){
               })

               .error(function(){
               });
            }
         }]);

         myApp.controller('myCtrl', ['$scope', 'fileUpload', function($scope, fileUpload){
            $scope.uploadFile = function(){
               var file = $scope.myFile;

               console.log('file is ' );
               console.dir(file);

               var uploadUrl = "/fileUpload";
               fileUpload.uploadFileToUrl(file, uploadUrl);
            };
         }]);

      </script>

   </body>
</html>

Це походить від TutorialsPoint , але ви принаймні добре зробили свою справу, виправляючи їх приклад, який навіть не може працювати через очевидні помилки!
Беніто

0

Приклад роботи з використанням простої директиви ( ng-file-model ):

.directive("ngFileModel", [function () {
  return {
      $scope: {
          ngFileModel: "="
      },
      link: function ($scope:any, element, attributes) {
          element.bind("change", function (changeEvent:any) {
              var reader = new FileReader();
              reader.onload = function (loadEvent) {
                  $scope.$apply(function () {
                      $scope.ngFileModel = {
                          lastModified: changeEvent.target.files[0].lastModified,
                          lastModifiedDate: changeEvent.target.files[0].lastModifiedDate,
                          name: changeEvent.target.files[0].name,
                          size: changeEvent.target.files[0].size,
                          type: changeEvent.target.files[0].type,
                          data: changeEvent.target.files[0]
                      };
                  });
              }
              reader.readAsDataURL(changeEvent.target.files[0]);
          });
      }
  }
}])

і використовувати FormDataдля завантаження файлу у своїй функції.

var formData = new FormData();
 formData.append("document", $scope.ngFileModel.data)
 formData.append("user_id", $scope.userId)

всі кредити призначені для https://github.com/mistralworks/ng-file-model

Я зіткнувся з невеликою проблемою, яку ви можете перевірити тут: https://github.com/mistralworks/ng-file-model/isissue/7

Нарешті, ось роздвоєне репо: https://github.com/okasha93/ng-file-model/blob/patch-1/ng-file-model.js


0

Код допоможе вставити файл

<body ng-app = "myApp">
<form ng-controller="insert_Ctrl"  method="post" action=""  name="myForm" enctype="multipart/form-data" novalidate>
    <div>
        <p><input type="file" ng-model="myFile" class="form-control"  onchange="angular.element(this).scope().uploadedFile(this)">
            <span style="color:red" ng-show="(myForm.myFile.$error.required&&myForm.myFile.$touched)">Select Picture</span>
        </p>
    </div>
    <div>
        <input type="button" name="submit"  ng-click="uploadFile()" class="btn-primary" ng-disabled="myForm.myFile.$invalid" value="insert">
    </div>
</form>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> 
<script src="insert.js"></script>
</body>

insert.js

var app = angular.module('myApp',[]);
app.service('uploadFile', ['$http','$window', function ($http,$window) {
    this.uploadFiletoServer = function(file,uploadUrl){
        var fd = new FormData();
        fd.append('file', file);
        $http.post(uploadUrl, fd, {
            transformRequest: angular.identity,
            headers: {'Content-Type': undefined}
        })
        .success(function(data){
            alert("insert successfull");
            $window.location.href = ' ';//your window location
        })
        .error(function(){
            alert("Error");
        });
    }
}]);
app.controller('insert_Ctrl',  ['$scope', 'uploadFile', function($scope, uploadFile){
    $scope.uploadFile = function() {
        $scope.myFile = $scope.files[0];
        var file = $scope.myFile;
        var url = "save_data.php";
        uploadFile.uploadFiletoServer(file,url);
    };
    $scope.uploadedFile = function(element) {
        var reader = new FileReader();
        reader.onload = function(event) {
            $scope.$apply(function($scope) {
                $scope.files = element.files;
                $scope.src = event.target.result  
            });
        }
        reader.readAsDataURL(element.files[0]);
    }
}]);

save_data.php

<?php
    require "dbconnection.php";
    $ext = pathinfo($_FILES['file']['name'],PATHINFO_EXTENSION);
    $image = time().'.'.$ext;
    move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$image);
    $query="insert into test_table values ('null','$image')";
    mysqli_query($con,$query);
?>

0

це працює

file.html

<html>
   <head>
      <script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
   </head>
   <body ng-app = "app">
      <div ng-controller = "myCtrl">
         <input type = "file" file-model = "myFile"/>
         <button ng-click = "uploadFile()">upload me</button>
      </div>
   </body>
   <script src="controller.js"></script>
</html>

controller.js

     var app = angular.module('app', []);

     app.service('fileUpload', ['$http', function ($http) {
        this.uploadFileToUrl = function(file, uploadUrl){
           var fd = new FormData();
           fd.append('file', file);

           $http.post(uploadUrl, fd, {
              transformRequest: angular.identity,
              headers: {'Content-Type': undefined}
           }).success(function(res){
                console.log(res);
           }).error(function(error){
                console.log(error);
           });
        }
     }]);

     app.controller('fileCtrl', ['$scope', 'fileUpload', function($scope, fileUpload){
        $scope.uploadFile = function(){
           var file = $scope.myFile;

           console.log('file is ' );
           console.dir(file);

           var uploadUrl = "/fileUpload.php";  // upload url stands for api endpoint to handle upload to directory
           fileUpload.uploadFileToUrl(file, uploadUrl);
        };
     }]);

  </script>

fileupload.php

  <?php
    $ext = pathinfo($_FILES['file']['name'],PATHINFO_EXTENSION);
    $image = time().'.'.$ext;
    move_uploaded_file($_FILES["file"]["tmp_name"],__DIR__. ' \\'.$image);
  ?>

0

ЗАВАНТАЖИТИ ФАЙЛИ

<input type="file" name="resume" onchange="angular.element(this).scope().uploadResume()" ng-model="fileupload" id="resume" />


        $scope.uploadResume = function () { 
            var f = document.getElementById('resume').files[0];
            $scope.selectedResumeName = f.name;
            $scope.selectedResumeType = f.type;
            r = new FileReader();

            r.onloadend = function (e) { 
                $scope.data = e.target.result;
            }

            r.readAsDataURL(f);

        };

СКАЧАТИ ФАЙЛИ:

          <a href="{{applicant.resume}}" download> download resume</a>

var app = angular.module("myApp", []);

            app.config(['$compileProvider', function ($compileProvider) {
                $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);
                $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);

            }]);

-1
app.directive('ngUpload', function () {   
  return {    
    restrict: 'A',  
    link: function (scope, element, attrs) {

      var options = {};
      options.enableControls = attrs['uploadOptionsEnableControls'];

      // get scope function to execute on successful form upload
      if (attrs['ngUpload']) {

        element.attr("target", "upload_iframe");
        element.attr("method", "post");

        // Append a timestamp field to the url to prevent browser caching results
        element.attr("action", element.attr("action") + "?_t=" + new Date().getTime());

        element.attr("enctype", "multipart/form-data");
        element.attr("encoding", "multipart/form-data");

        // Retrieve the callback function
        var fn = attrs['ngUpload'].split('(')[0];
        var callbackFn = scope.$eval(fn);
        if (callbackFn == null || callbackFn == undefined || !angular.isFunction(callbackFn))
        {
          var message = "The expression on the ngUpload directive does not point to a valid function.";
          // console.error(message);
          throw message + "\n";
        }                      

        // Helper function to create new  i frame for each form submission
        var addNewDisposableIframe = function (submitControl) {
          // create a new iframe
          var iframe = $("<iframe id='upload_iframe' name='upload_iframe' border='0' width='0' height='0' style='width: 0px; height: 0px;
border: none; display: none' />");

          // attach function to load event of the iframe
          iframe.bind('load', function () {

              // get content - requires jQuery
              var content = iframe.contents().find('body').text();

              // execute the upload response function in the active scope
              scope.$apply(function () { callbackFn(content, content !== "" /* upload completed */); });

              // remove iframe
              if (content != "") // Fixes a bug in Google Chrome that dispose the iframe before content is ready.
                setTimeout(function () { iframe.remove(); }, 250);


              submitControl.attr('disabled', null);
              submitControl.attr('title', 'Click to start upload.');
            });

          // add the new iframe to application
          element.parent().append(iframe);
        };

        // 1) get the upload submit control(s) on the form (submitters must be decorated with the 'ng-upload-submit' class)
        // 2) attach a handler to the controls' click event
        $('.upload-submit', element).click(
          function () {

            addNewDisposableIframe($(this) /* pass the submit control */);

            scope.$apply(function () { callbackFn("Please wait...", false /* upload not completed */); });



            var enabled = true;
            if (options.enableControls === null || options.enableControls === undefined || options.enableControls.length >= 0) {
              // disable the submit control on click
              $(this).attr('disabled', 'disabled');
              enabled = false;
            }

            $(this).attr('title', (enabled ? '[ENABLED]: ' : '[DISABLED]: ') + 'Uploading, please wait...');

            // submit the form
            $(element).submit();
          }
        ).attr('title', 'Click to start upload.');
      }
      else
        alert("No callback function found on the ngUpload directive.");     
    }   
  }; 
});



<form class="form form-inline" name="uploadForm" id="uploadForm"
ng-upload="uploadForm12"  action="rest/uploadHelpFile"  method="post"
enctype="multipart/form-data" style="margin-top: 3px;margin-left:
6px"> <button type="submit" id="mbUploadBtn" class="upload-submit"
ng-hide="true"></button> </form>

@RequestMapping(value = "/uploadHelpFile", method =
RequestMethod.POST)   public @ResponseBody String
uploadHelpFile(@RequestParam(value = "file") CommonsMultipartFile[]
file,@RequestParam(value = "fileName") String
fileName,@RequestParam(value = "helpFileType") String
helpFileType,@RequestParam(value = "helpFileName") String
helpFileName) { }

будь ласка, відформатуйте свою відповідь не у належному форматі
Saineshwar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.