html - 显示从不同目录中选择的文件列表以及删除文件的能力
问题描述
我正在尝试附加一些文件(零/单个/多个)并使用 ANGULARJS 和 spring 将它们作为附件发送到电子邮件中。
需要注意的一件事是,从多个目录中选择文件时,仅显示最近选择的文件,而不显示以前选择的文件。我怎样才能显示用户从不同目录中选择的所有文件,并在提交表单之前提供删除文件(所有文件或一个文件)的能力。
演示:http ://plnkr.co/edit/M3f0TxHNozRxFEnrqyiF?p=preview
html:
<body ng-controller="MainCtrl">
<p>Hello {{name}}!</p>
TO: <input type="text" name="to" id="to" ng-model="to" required ></input><br>
Subject : <input type="text" name="subject" id="subject" ng-model="subject"></input>
<br>Attachment: <input type="file" ng-file-model="files" multiple /> <br>
<p ng-repeat="file in files">
{{file.name}}
</p>
<textarea rows="20" maxlength=35000 name="message" ng-model="message" ></textarea>
<button type="button" ng-click="upload()">Send</button>
</body>
js:
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
$scope.files = [];
$scope.upload=function(){
alert($scope.files.length+" files selected ... Write your Code to send the mail");
};
});
app.directive('ngFileModel', ['$parse', function ($parse) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var model = $parse(attrs.ngFileModel);
var isMultiple = attrs.multiple;
var modelSetter = model.assign;
element.bind('change', function () {
var values = [];
angular.forEach(element[0].files, function (item) {
var value = {
// File Name
name: item.name,
//File Size
size: item.size,
//File URL to view
url: URL.createObjectURL(item),
// File Input Value
_file: item
};
values.push(value);
});
scope.$apply(function () {
if (isMultiple) {
modelSetter(scope, values);
} else {
modelSetter(scope, values[0]);
}
});
});
}
};
}]);
解决方案
默认浏览器行为显示当前选定的文件,以更改您必须自定义该文件。而且,我看到了你的自定义指令代码,它不允许从不同的目录中选择多个文件。所以,你可以做的是,创建另一个范围变量 & 每次用户选择文件/文件时,你将这些文件推送到这个数组。通过这种方式,您已经设置了来自相同/不同目录的所有选定文件,然后您可以对最终将要更新的每个文件具有删除功能。更新了 html 视图部分:
Attachment: <input type="file" ng-file-model="files" multiple /><br>
<p ng-repeat="file in filesToUpload track by $index">
{{file.name}} <span class="delete-file" ng-click="deleteFile($index)">X</span>
</p>
对于这个新的数组更新指令 scope.$apply 部分为:
scope.$apply(function () {
if (isMultiple) {
modelSetter(scope, values);
} else {
modelSetter(scope, values[0]);
}
if(values){
scope.filesToUpload = scope.filesToUpload.concat(values);
}
});
在控制器中具有 deleteFile 功能:
$scope.deleteFile = function(index){
$scope.filesToUpload.splice(index, 1);
};
现在用户可以随时删除文件。但是输入字段仍将显示最后选择的文件/文件,并且在删除特定文件后它也不会更改其状态,因此您可以通过 opacity: 0; 隐藏字段;css 然后创建自定义的上传按钮并从该触发器单击实际隐藏的文件输入元素。
更新:使用自定义上传按钮检查相同代码的更新: Plunker Example
推荐阅读
- javascript - Game of Life p5.js 无法更新单元格
- android - 将 TextView 插入 Firebase
- symfony - Messenger symfony:工人没有效果
- angular - 如何将动态创建的组件插入到模板中
- php - 如何在时间段中进行预订或隐藏
- c# - 是否可以创建多个 IValidateOptions
对于一个配置类? - flutter - Flutter MainAxisAlignment 无法正常工作
- excel - 如果单元格中没有条目,如何跳过,然后下一个 x
- python - 抓取 Web 文档以及计算的样式
- asp.net - 如果 Django 请求过长会发生什么?