У меня есть тип ввода = "файл" следующим образом:
<input id="identityDocument" name="identityDocument" ng-model="candidature.identityDocument"
ui-jq="filestyle" type="file" class="filestyle input-lg"
file-model="uploadIdentityDocument"
ui-options="{
buttonText: '{{'ACTIONS.UPLOAD' | translate}}',
iconName: 'fa fa-inbox'
}"
accept="image/*" valid-file required>
чтобы этот входной файл был известен в области действия, я использую эту директиву:
.directive('fileModel',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]);
});
});
}
};
});
Поэтому я хочу, когда я отправлю эту форму, чтобы загрузить файл в нем, как показано ниже:
let file = $scope.uploadIdentityDocument;
let fd = new FormData();
fd.append('file', file);
$http.post('http://localhost:8080/fileUpload', fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
})
.success(function(){
})
.error(function(){
});
на стороне сервера это моя служба отдыха:
@RestController
public class UploadService {
@Autowired
IUploadMetier uploadMetier;
@RequestMapping(value="/fileUpload", method = RequestMethod.POST)
public ResponseEntity<String> UploadFile(MultipartHttpServletRequest request) {
String response = uploadMetier.uploadFile(request);
if(response.equals("false")){
return new ResponseEntity<>("There was an error uploading this file: " + response + " to the server :-(", HttpStatus.INTERNAL_SERVER_ERROR);
}else{
return new ResponseEntity<>("The file: " + response + " has uploaded successfully :-)", HttpStatus.OK);
}
}
}
и это функция, которая загружает файл:
public String uploadFile(MultipartHttpServletRequest request) {
Iterator<String> itr=request.getFileNames();
MultipartFile file=request.getFile(itr.next());
String fileName=file.getOriginalFilename();
File dir = new File("\\MyPath");
if (dir.isDirectory())
{
File serverFile = new File(dir,fileName);
BufferedOutputStream stream = null;
try {
stream = new BufferedOutputStream(
new FileOutputStream(serverFile));
stream.write(file.getBytes());
stream.close();
} catch (IOException e) {
e.printStackTrace();
return "false";
}
}else {
return "false";
}
return fileName;
}
но затем я получаю это сообщение об ошибке:
java.util.NoSuchElementException: null
at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:713) ~[na:1.8.0_73]
at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:734) ~[na:1.8.0_73]
at org.capvalue.fme.metier.mpl.UploadMetierImpl.uploadFile(UploadMetierImpl.java:19) ~[classes/:na]
at org.capvalue.fme.web.rest.UploadService.UploadFile(UploadService.java:23)
строка UploadMetierImpl.java:19
относится к: MultipartFile file=request.getFile(itr.next());
как я могу это решить?
Я просто заметил, что когда я console.log $scope.uploadIdentityDocument
я $scope.uploadIdentityDocument
неопределенным, и я не знаю, почему я это получаю!
Ошибка заключалась в том, что параметр $ scope.identityDocUpload не был определен, решение заключалось в том, чтобы удалить эту директиву fileModel, которую я использовал, и добавил это к моему вводу:
onchange="angular.element(this).scope().setFile(this,'identityDocumentUpload')"
Функция setFile
:
$scope.setFile = function(element, name) {
$parse(name).assign($scope, element.files[0]);
}