AngularJS 使用 ng-upload 上传图片

     2023-03-04     111

关键词:

【中文标题】AngularJS 使用 ng-upload 上传图片【英文标题】:AngularJS Uploading An Image With ng-upload 【发布时间】:2013-06-17 11:55:18 【问题描述】:

我正在尝试使用 ng-upload 在 AngularJS 中上传文件,但我遇到了问题。我的 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 中,函数 uploadPostImage 'contents' 参数始终未定义,即使 'completed' 参数返回为 true。

我们的目标是只上传一张图片进行裁剪。在这个过程中我做错了什么?

【问题讨论】:

访问这里通过 Angular 获取简单的图片上传教程。它真的帮助了我tutorialspoint.com/angularjs/angularjs_upload_file.htm 注意这个问题与ng-upload 库有关。不是ng-file-upload 库。 【参考方案1】:

几乎没有关于上传文件的 Angular 文档。许多解决方案需要自定义指令其他依赖项(primis中的jquery ...只是为了上传文件...)。经过多次尝试后,我发现只有 angularjs(在 v.1.0.6 上测试)

html

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

Angularjs (1.0.6) 不支持“输入文件”标签上的 ng-model ,因此您必须以“本机方式”来传递所有(最终)选定的文件来自用户。

控制器

$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.identity 让 $http 能够选择正确的“内容类型”并管理处理多部分数据时所需的边界。

【讨论】:

我可以在这里连同 fd 一起发送一些 JSON 数据吗?在 fd 我总是得到空值,但文件 [0] 在那里。有什么问题 您使用的是此处发布的代码吗?无论如何关于发送 json 数据,实际上还不知道:p 最好在这个主题上发布一个新答案。 在我开发php之前已经很久了,无论如何这与使用文件“文件”构建表单然后在“uploadUrl”处使用POST提交的效果相同。 @StenMuchow 遗憾的是,'file' 似乎还不支持与 ng-change github.com/angular/angular.js/issues/1375的绑定 答案是针对 AngularJS 1.0.6 给出的。 Angular 1.2.26 或 1.3 现在有更好的东西吗?文档仍然没有提供更好的解决方法。【参考方案2】:

你可以试试ng-file-upload angularjs 插件(而不是ng-upload)。

设置和处理 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);
      );
    
  ;
];

【讨论】:

【参考方案3】:

在我的情况下,上述方法适用于 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);
      
 );   
;

【讨论】:

这个答案使用 jQuery 而不是 ng-file-upload 或 AngularJS $http 服务。 @Tek Raj Pant 你有什么想法吗?我如何在上面的 html 部分给出默认图像。我想默认设置一个图像,这样我的按钮就可以安全地保存工作,而无需调用或不调用 onchange【参考方案4】:
        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 ****************

    imgwidth: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>

【讨论】:

如何使用 AngularJS 将文件上传到 Google Drive

】如何使用AngularJS将文件上传到GoogleDrive【英文标题】:HowtouploadfiletoGoogleDrivewithAngularJS【发布时间】:2015-12-1110:07:12【问题描述】:我卡住了,我无法使用AngularJS将文件上传到GoogleDrive。现在我的客户想知道他们想使用AngularJS将... 查看详情

使用 AngularJS 上传文件

】使用AngularJS上传文件【英文标题】:FileUploadusingAngularJS【发布时间】:2013-09-0510:21:53【问题描述】:这是我的HTML表单:<formname="myForm"ng-submit=""><inputng-model=\'file\'type="file"/><inputtype="submit"value=\'Submit\'/></for 查看详情

使用 AngularJS 和 SpringMVC 进行多部分文件上传

】使用AngularJS和SpringMVC进行多部分文件上传【英文标题】:MultipartFileUploadusingAngularJSandSpringMVC【发布时间】:2017-07-2900:45:09【问题描述】:我是angularJS的新手,并尝试使用angularJS和SpringMVC上传文件,但无法获得所需的解决方案并... 查看详情

AngularJS:使用 $resource 上传文件(解决方案)

】AngularJS:使用$resource上传文件(解决方案)【英文标题】:AngularJS:Uploadfilesusing$resource(solution)【发布时间】:2014-02-0215:27:20【问题描述】:我正在使用AngularJS与RESTful网络服务进行交互,使用$resource来抽象暴露的各种实体。其... 查看详情

如何在angularjs中使用ng-file上传裁剪和上传图像

】如何在angularjs中使用ng-file上传裁剪和上传图像【英文标题】:Howtocropanduploadaimageusingng-fileuploadinangularjs【发布时间】:2015-12-0114:04:24【问题描述】:您好,我正在尝试裁剪图像并使用angularjs中的ng-file上传来上传图像。裁剪后... 查看详情

angularjs使用$httppost上传文件的时候,怎样获取文件上传的进度

参考技术A对比一下文件大小 查看详情

AngularJS:如何使用多部分表单实现简单的文件上传?

】AngularJS:如何使用多部分表单实现简单的文件上传?【英文标题】:AngularJS:howtoimplementasimplefileuploadwithmultipartform?【发布时间】:2012-12-0710:23:40【问题描述】:我想从AngularJS到node.js服务器做一个简单的多部分表单发布,表单的... 查看详情

在上传 Angularjs 之前预览图片

】在上传Angularjs之前预览图片【英文标题】:PreviewImagebeforeuploadingAngularjs【发布时间】:2013-09-1606:56:57【问题描述】:您好,我想知道在使用angularjs上传图片之前是否可以预览图片?我正在使用这个库。https://github.com/danialfarid/an... 查看详情

使用 AngularJS 和 ASP.NET Web API 上传/下载字节数组

】使用AngularJS和ASP.NETWebAPI上传/下载字节数组【英文标题】:Uploading/DownloadingByteArrayswithAngularJSandASP.NETWebAPI【发布时间】:2014-11-1806:50:12【问题描述】:我花了几天时间研究和研究上传/下载byte[]的解决方案。我很接近,但还有一... 查看详情

使用 angularjs 中的图像视图、裁剪和上传创建用于图像上传的 md 对话框

】使用angularjs中的图像视图、裁剪和上传创建用于图像上传的md对话框【英文标题】:Createamd-dialogboxforimageuploadwithimageview,cropanduploadinangularjs【发布时间】:2016-07-1319:24:38【问题描述】:我想使用Angular材质创建一个md对话框,其... 查看详情

无法上传文件,php和angularjs

】无法上传文件,php和angularjs【英文标题】:Can\'tuploadfiles,phpandangularjs【发布时间】:2014-11-2113:33:40【问题描述】:我正在尝试使用angularJs和PHP上传文件。我正在使用angular-file-upload,https://github.com/danialfarid/angular-file-upload。问题... 查看详情

在 MVC .net 核心中使用 Angularjs 上传文件和数据

】在MVC.net核心中使用Angularjs上传文件和数据【英文标题】:UploadFileandDatawithAngularjsinMVC.netcore【发布时间】:2021-09-1914:01:31【问题描述】:<inputtype="file"ng-model="ch.FileName"id="file"name="myFile"nchange="angular.element(this).scope().saveC 查看详情

angularjs上传图片

上传图片需要引入插件ngFileUpload,使用bower安装方法:bowerinstall ng-file-upload--save,安装后需要在命名app的名字js文件中注入,如下所示:(function(){angular.module(‘app‘,[‘ionic‘,‘ngStorage‘,‘ngFileUpload‘]);})();在相应的html中引入... 查看详情

nodejs + multer + angularjs 无需重定向即可上传

】nodejs+multer+angularjs无需重定向即可上传【英文标题】:nodejs+multer+angularjsforuploadingwithoutredirecting【发布时间】:2016-01-0214:32:18【问题描述】:我正在使用Nodejs+Multer+angularjs在服务器上上传文件。我有一个简单的HTML文件:<formact... 查看详情

以角度上传多个文件

...必须在单击保存按钮时立即提交所有这些文件。我有点被ng-upload卡住了,它需要一个api调用,而且我真的不能对这个 查看详情

angularjs使用$httppost上传文件的时候,怎样获取文件上传的进度

angular在1.5.5以上的版本中,在$http中也加入了eventHandler和uploadEventHandlers等方法,所以可以直接这样写:$http(method:'POST',url:url,eventHandlers:progress:function(c)console.log('Progress->'+c);console.log(c);,uploadEventHandlers:progress:function(e)co... 查看详情

带有文件上传的AngularJs Ajax POST表单

】带有文件上传的AngularJsAjaxPOST表单【英文标题】:AngularJsAjaxPOSTformwithfileupload【发布时间】:2013-10-2501:33:53【问题描述】:我正在尝试设置一个表单,以使用ajax请求提交给已经使用Ajax构建的api。出于某种原因,文件只是不想传... 查看详情

在Laravel中通过AngularJs上传文件时获取值为null

】在Laravel中通过AngularJs上传文件时获取值为null【英文标题】:GettingvaluenullwhileuploadingfilethroughAngularJsinLaravel【发布时间】:2020-02-2704:32:19【问题描述】:当我尝试在AngularJs中使用POST请求上传文件时,我无法上传文件,因为它显... 查看详情