【问题标题】:read image file in servlet from angular js [duplicate]从角度js读取servlet中的图像文件[重复]
【发布时间】:2015-07-02 18:47:18
【问题描述】:

我有一个用户可以上传图片的页面。我正在使用 Angular js 的发布请求将数据发布到 url。我的疑问是如何在 servlet 中检索这些数据。我想将图像保存在数据库中。请让我知道这是否是执行此活动的正确方法

//Controller
app.controller('myCtrl', ['$scope', 'fileUpload', function($scope, fileUpload){

$scope.uploadFile = function(){
    var file = $scope.myFile;
    console.log('file is ' + (file));
    var uploadUrl = "/Angular/login";
    fileUpload.uploadFileToUrl(file, uploadUrl);
};

}]);
//Service
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(){
    })
    .error(function(){
    });
}
}]);

//directive
app.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]);
            });
        });
    }
};
}]);

我应该如何在 java servlet 中检索上述发布的数据..?

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


}

【问题讨论】:

  • Servlet 解析 multipart/form-data 请求的代码与使用普通 HTML 表单时没有区别。

标签: javascript java angularjs servlets


【解决方案1】:

您可以安全地为此使用 Apache Commons FileUpload,它也适用于较旧的 servlet 版本。

查看http://commons.apache.org/proper/commons-fileupload/using.html

AngularJS 客户端代码

<!DOCTYPE html>
<html ng-app="FileuploadApp">
<head>
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
<script>
angular
    .module("FileuploadApp", [])
    .controller("FileCtrl", function($scope, $http) {
        $scope.upload = function() {
            var fd = new FormData();
            fd.append("file", $scope.file);
            $http({
                withCredentials: true,
                method: 'POST',
                url: './fileupload',
                data: fd,
                headers: { 'Content-Type': undefined },
                transformRequest: angular.identity
            });
        }
    })
    .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]);
                });
            });
        }
    };
}]);
</script>
</head>
<body ng-controller="FileCtrl">
    <input type="file" file-model="file"/>
    <input type="button" value="Upload!" ng-click="upload();">
</body>
</html>

Java Servlet 代码

@WebServlet(urlPatterns="/fileupload")
public class FileuploadTestServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        if (ServletFileUpload.isMultipartContent(req)) {
            try {
                DiskFileItemFactory factory = new DiskFileItemFactory();
                ServletContext servletContext = this.getServletConfig().getServletContext();
                File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
                factory.setRepository(repository);
                ServletFileUpload fileUpload = new ServletFileUpload(factory);
                List<FileItem> files = fileUpload.parseRequest(req);

                if (files != null && !files.isEmpty()) {
                    for (FileItem item : files) {
                        System.out.println("* " + item.getName() + " " + item.getSize() + " bytes.");
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            }

        }

    }
}

控制台输出:

* cthulhu.bin 42 bytes.

【讨论】:

    【解决方案2】:

    您可以使用InputStream stream = request.getInputStream(); 从 servlet 请求中读取原始数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 2012-01-27
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      相关资源
      最近更新 更多