我已经审查了有关此主题的问题和答案,但我认为它们不能完全回答我的问题:
使用有角度的前端(无论采用哪种方式)进行上传,都会将文件数据发送到服务器上的脚本(例如php脚本)(这是我的首选方法)。一旦运行了php脚本,我想返回到进行上传的页面并在其中提供消息。我不希望显示php页面。将不胜感激如何实现这一目标的一些指导。理想情况是将什么代码添加到php脚本中。
我想捕获与文件有关的信息并将其保存到数据库,例如文件名和用户输入/选择的数据(例如文档类别)。有没有办法在上传文件时实现这一目标?即,理想情况下,用户将以包含文件上传按钮的表单完成输入,以便用户选择要上传的文件,但仅在单击表单提交时,文件上传才会与其他表单数据一起返回以进行处理。
我已经花了三天的时间了..所以任何帮助都会很棒。
您可以使用FormData对象将表单数据发送到服务器,这将允许您同时发送文件和文本数据。您可以在此处找到有关它的更多信息。
index.html
<body ng-controller="myCtrl"> <div class="file-upload"> <input type="text" ng-model="name"> <input type="file" file-model="myFile"/> <button ng-click="uploadFile()">upload me</button> </div> </body>
在app.js中,我们创建了一个自定义指令fileModel,其中我们侦听输入元素内容的更改,并相应地更改范围内变量的值。这是通过$ parse服务在我们的范围内设置值来实现的。
fileModel
app.js
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]); }); }); } }; }]); // We can write our own fileUpload service to reuse it in the controller myApp.service('fileUpload', ['$http', function ($http) { this.uploadFileToUrl = function(file, uploadUrl, name){ var fd = new FormData(); fd.append('file', file); fd.append('name', name); $http.post(uploadUrl, fd, { transformRequest: angular.identity, headers: {'Content-Type': undefined,'Process-Data': false} }) .success(function(){ console.log("Success"); }) .error(function(){ console.log("Success"); }); } }]); myApp.controller('myCtrl', ['$scope', 'fileUpload', function($scope, fileUpload){ $scope.uploadFile = function(){ var file = $scope.myFile; console.log('file is ' ); console.dir(file); var uploadUrl = "save_form.php"; var text = $scope.name; fileUpload.uploadFileToUrl(file, uploadUrl, text); }; }]);
save_form.php
<?php $target_dir = "./upload/"; $name = $_POST['name']; print_r($_FILES); $target_file = $target_dir . basename($_FILES["file"]["name"]); move_uploaded_file($_FILES["file"]["tmp_name"], $target_file); //write code for saving to database include_once "config.php"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO MyData (name,filename) VALUES ('".$name."','".basename($_FILES["file"]["name"])."')"; if ($conn->query($sql) === TRUE) { echo json_encode($_FILES["file"]); // new file uploaded } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>