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>또는 사용과 같은 백업 전략이 필요합니다 .

파일 업로드를 수행하기위한 많은 Angular.js 모듈이 이미 있습니다. 이 두 가지는 이전 브라우저를 명시 적으로 지원합니다.

그리고 다른 옵션들 :

이 중 하나는 프로젝트에 적합해야하거나 직접 코딩하는 방법에 대한 통찰력을 제공 할 수 있습니다.


4
하나 개 더 솔루션 (파일 업로드의 IaaS) : github.com/uploadcare/angular-uploadcare
— 데이비드 Avsajanishvili

27
- 지식인이에 좋은 비디오가 egghead.io/lessons/angularjs-file-uploads을
— 아담 Zerner에게

2
danialfarid / angular-file-upload는 ng-file-upload로 이름이 변경되었습니다
— Michael

5
3 세 답변. IE 9는 2016 년에 지금 죽은
— user2404597

5
링크를 가리키는 대신 적절한 해결책을 갖기 위해 답변을 업데이트해야한다고 생각합니다. 이것이 스택 오버플로의 방법입니다. 그렇지 않으면 그냥 주석으로 만드십시오.
— Alex Reynolds

178

가장 쉬운 방법은 HTML5 API를 사용하는 것입니다. FileReader

HTML은 매우 간단합니다.

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

컨트롤러에서 'add'메소드를 정의하십시오.

$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는 표준 HTML5 파일 API w3.org/TR/FileAPI 의 클래스입니다 . html 입력 요소에 지정된 파일에서 데이터를 읽고 onloadend콜백 함수 내에서 처리 할 수 ​​있습니다 . 이 API를 사용하기 위해 라이브러리가 필요하지 않습니다 (이전 API를 사용하지 않는 한). 도움이 되었기를 바랍니다.
— yagger

15
FileReader.readAsBinaryString 은 2012 년 7 월 12 일부터 W3C 작업 초안에서 사용되지 않습니다.
— Shane Stillwell

13
각도로 DOM에 액세스해서는 안됩니다. 매우 나쁜 연습입니다.
— jeanmatthieud 2016 년

9
@Siderex는 컨트롤러가 아니지만 지시문에서 수행하는 것이 좋습니다. 실제로 이것은 지시문의 목적입니다. Angular docs docs.angularjs.org/guide/directive
— yagger

1
@ yagger는 링크가 readAsArrayBuffer일반적인 비동기 FileReader API 대신 FileReaderSync의 메소드 (웹 워커에서만 사용 가능)를 참조하는 특별한 이유 가 있습니까?
— doldt 2016 년

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 바이올린 (프론트 엔드 전용) https://jsfiddle.net/vince123/8d18tsey/31/


노드에서 파일을 어떻게 가져 옵니까?
— Juicy

더 자세한 정보가 있습니까? ng-submit양식 작업 이 필요 합니까? 이것만으로는 아무것도하지 않습니다
— Aron

@Emaborsa 안녕하세요, jsfiddle을 추가하고 더 완전한 PHP 코드 예제를 만들었습니다. 파일 입력 값이 변경된 후 이미지를 제출하므로 ng-submit이 필요하지 않습니다.
— Vince Verhoeven

가장 간단한 솔루션이지만 WCF 서비스가 업로드되는 데이터에 대처하는 방법을 알아내는 데 오랜 시간이 걸렸습니다. 그건 중요한 당신이 데이터 스트림을, 실제로 파일의 데이터를 읽어 MultiParser 같은 것을 통해 전달할 것을 : stackoverflow.com/a/23702692/391605은 그렇지 않으면 ------ WebKitFormBoundary "원시 바이트를 저장됩니다 내용 처리 : ... 등. "
— Mike Gledhill

Manoy Ojha가 조금 더 아래에 표시된 것처럼 $ http 요청 객체에 'transformRequest : angular.identity'속성을 추가해야했습니다. 그렇지 않으면 Content-Type이 올바르게 설정되지 않아 예제가 작동하지 않습니다.
— 그레고르 슬라 벡

38

다음은 파일 업로드의 실제 예입니다.

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

이 하나의 함수에서

setFiles

컨트롤러에서 파일 배열을 업데이트하는 View에서

또는

AngularJS를 사용하여 jQuery 파일 업로드를 확인할 수 있습니다

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


안녕하세요, 나는 하나의 파일을 업로드하고 바로 아래에 표시 할 수있는 것을 찾고있었습니다. 그러나 귀하의 예에서 나는 똑같이 할 수 없었습니다. 신경 쓰지 말고 나는이 angularjs에 익숙하지 않으며이 특정 목표를 더 간단하면서도 강력하게 수행하는 법을 배우려는 의도가 있습니다.
— Aditya Sethi

이것은 많은 도움이되었습니다. 감사!
— RachelD

추가 라이브러리 / 확장을 사용하지 않는 훌륭한 예입니다. 감사.
— markdsievers

4
매우 유용합니다. 참고 사항입니다. 이것은 IE9 이하에서 작동하지 않는 파일 API를 사용합니다.
— 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
가장 좋은 방법!
— Stepan Yakovenko

11

@Anoyz (정답)가 제공하는 모든 대안을 시도했지만 가장 좋은 해결책은 https://github.com/danialfarid/angular-file-upload입니다.

일부 특징 :

  • 진행
  • 멀티 파일
  • 필드
  • 이전 브라우저 (IE8-9)

그것은 나를 위해 잘 작동합니다. 지시 사항에만주의를 기울여야합니다.

서버 측에서는 NodeJs, Express 4 및 Multer 미들웨어를 사용하여 멀티 파트 요청을 관리합니다.


이미지를 어떻게 표시합니까? 백엔드에서 성공적으로 들어가지만 nlzt9LJWRrAZEO3ZteZUOgGc.png 형식으로 저장 되지만 .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>요소는 기본적으로 ng-model 지시문 과 함께 작동하지 않습니다 . 사용자 지정 지시문 이 필요합니다 .

1select-ng-files 과 작동하는 지시문의 실무 데모ng-model

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.postA로부터 파일리스트

$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);
};

File 객체 와 함께 POST를 보낼 때 설정하는 것이 중요합니다 '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);
    });
});

그런 다음 아약스 전화에서 :

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 파일 업로드

파일을 업로드하기위한 경량 Angular JS 지시문

여기 DEMO 페이지가 있습니다.

  • 업로드 진행, 업로드 진행중 취소 / 중단 지원, 파일 드래그 앤 드롭 (html5), 디렉토리 드래그 앤 드롭 (웹킷), CORS, PUT (html5) / POST 방법, 파일 유형 및 크기의 검증, 선택된 이미지의 미리보기 표시 / audio / videos.
  • Flash polyfill FileAPI를 사용하여 크로스 브라우저 파일 업로드 및 FileReader (HTML5 및 비 HTML5) 파일을 업로드하기 전에 클라이언트 측 유효성 검사 / 수정 가능
  • Upload.http ()를 사용하여 파일의 컨텐츠 유형으로 db 서비스 CouchDB, imgur 등으로 직접 업로드 이것은 각도 http POST / PUT 요청에 대한 진행 이벤트를 가능하게합니다.
  • 별도의 shim 파일, FileAPI 파일은 HTML5가 아닌 코드에 대해 요청시로드되므로 HTML5 만 지원하면 추가로드 / 코드가 없습니다.
  • 일반 $ http를 사용하여 가벼우 며 (HTML5가 아닌 브라우저의 경우 shim 포함) 모든 각도 $ 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'가 정확히 어디에 사용되는지 설명해 주시겠습니까?
— 마크 J. 슈미트

파일 입력이 변경되면이 기능을 트리거하면 업로드 프로세스가 시작됩니다.
— 파시

1
이 없기 때문에 <input type="file" ng-change="contentChanged($event)">어떻게해야합니까?
— 마크 J. 슈미트

3

http://jsfiddle.net/vishalvasani/4hqVu/ 는 크롬과 IE에서 잘 작동합니다 (배경 이미지에서 CSS를 약간 업데이트하는 경우). 진행률 표시 줄을 업데이트하는 데 사용됩니다.

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

FireFox angular의 [백분율] 데이터는 파일이 성공적으로 업로드되지만 DOM에서 성공적으로 업데이트되지 않습니다.


FF의 load경우 이벤트 를 청취 할 수 있으며 길이가 계산 가능한 경우 진행 이벤트를 시작하여 업로드에 성공했음을 나타냅니다. github.com/danialfarid/angular-file-upload가 이미 처리하고 있습니다.
— danial

거기에 있지만 주어진 바이올린에서 확인되고 적용됩니다. FF에는 여전히 희망이 없습니다.
— mayankcpdixit

uploadComplete 내에서 uploadProgress를 호출하면 FF에서 작동해야합니다.
— danial

아니요, 그렇지 않은 경우에도 이유를 설명해 주시겠습니까? 내 게시물에 바이올린 링크가 있습니다. 가능하다면 FF에서 작동하도록 업데이트하고 여기에 솔루션의 링크를 주석으로 보내주십시오.
— mayankcpdixit

Firefox의 버전은 무엇입니까?
— danial

3

Uploadcare 와 같은 파일 업로드를 위해 IaaS를 고려할 수 있습니다 . https://github.com/uploadcare/angular-uploadcare를 위한 Angular 패키지가 있습니다.

기술적으로 이것은 지시문으로 구현되어 다른 업로드 옵션과 위젯 내에서 업로드 된 이미지 조작을 제공합니다.

<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" />

Web API를 사용하는 예제를 통해 Github에서 더 간단하게 업로드 할 수 있습니다 .


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-guru의 답변에 대한 업데이트 / 주석이어야하지만 충분한 담당자가 없기 때문에 여기로 갈 것입니다. 이제 코드에서 생성 된 오류를 수정합니다.

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;         
});
}

컨트롤러에 더 많은 코드를 추가하십시오-아래 코드는 함수에 추가됩니다. 이 기능은 "ahit (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>

angularJS 컨트롤러에서

$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 로 이동 하십시오

나는 당신이 그것을 확인할 수있는 작은 probelm에 직면했다 : https://github.com/mistralworks/ng-file-model/issues/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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.