Я изо всех сил пытался загрузить файл с помощью Angular JS для POST на мой бэкэнд RESTful Java Play Framework, поскольку многие примеры, которые я обнаружил, не относятся ко мне.

Я уверен, что мой код Angular JS работает нормально, но я все равно поделюсь им:

< Сильный > файл - upload.html

<div data-ng-controller="uploadCtrl">
    <input type="file" file-model="myFile" id="theFile" name="theFile" />
    <button data-ng-click="uploadFile()">Upload</button>
</div>

file-upload-ctrl.js

"использовать строго";

angular.module("pamm").controller("uploadCtrl", ["$scope", "fileUploadRepository",
    function($scope, fileUploadRepository) {

        $scope.uploadFile = function () {
            var file = $scope.myFile;
            console.dir("Ctrl: " + file);

            fileUploadRepository.uploadFile(file);
        }
    }]);

file-upload-repo.js

"use strict";

angular.module("pamm").service("fileUploadRepository", ["$q", "$log",  "$rootScope", "contextEvent", "fileUploadDao",
    function ($q, $log, $rootScope, contextEvent, fileUploadDao) {

        var fileUploadCache = [];

        (function init() {
            $rootScope.$on(contextEvent.CLEAR_CONTEXT, function clearContext() {
                fileUploadCache = [];
                $log.info("fileUploadRepository: context cleared");
            })
        })();

        this.uploadFile = function (file) {
            var waitingDialog = $$dialog.waiting("Please wait - Uploading file");

            var deferred = $q.defer();

            fileUploadDao.uploadFile(file).then(function (uploadedFile) {
                fileUploadCache.push(uploadedFile);
                $log.debug("Repo: " + uploadedFile);
                waitingDialog.close();
                deferred.resolve(uploadedFile);
            }, function (error) {
                deferred.reject(error);
                waitingDialog.close();
            });

            return deferred.promise;
        };
    }]);

Уровень выше репо

"use strict";

angular.module("pamm").service("fileUploadDal", ["$http", "$q", "$log", function ($http, $q, $log) {
    this.http = (function serviceCaller() {
        return {
            /**
             * @returns {promise}
             */
            POST: function (apiPath, fd) {
                var deferred = $q.defer();
                $http.post(apiPath, fd, {
                    transformRequest: angular.identity,
                    headers: {'Content-Type': undefined}
                }).then(function (results) {
                    deferred.resolve(results.data);
                }, function (e) {
                    deferred.reject(e);
                });
                return deferred.promise;
            }
        }
    })();
    $log.info("fileUploadDal:serviceCaller Instantiated");
}]);

Java

Http.MultipartFormData file = request().body().asMultipartFormData();

Куда я могу пойти дальше? Следовательно, я не могу получить доступ к имени ввода HTML из-за того, как написан мой Angular.

Что я могу сделать с file, чтобы сохранить этот файл в желаемом каталоге.

Благодарность,

2
Jordan 18 Фев 2016 в 12:37

2 ответа

Лучший ответ
public ServiceResult execute(final Http.MultipartFormData request)
{
    final String DIRECTORY = "C:\\SAVE_DIRECTORY\\SUB_FOLDER\\uploads";

        List<Http.MultipartFormData.FilePart> targetFiles = request.getFiles();

        for (int i = 0; i < targetFiles.size(); i++)
        {
            File file = targetFiles.get(i).getFile();

            String fileName = targetFiles.get(i).getFilename();

            file.renameTo(new File(DIRECTORY, fileName));
        }

        return new ServiceResult(Json.toJson(targetFiles));
    }
0
Jordan 19 Фев 2016 в 09:17

Вы пробовали это:

import java.io.File;

File fileFromRequest = request.body().asRaw().asFile();
fileFromRequest.renameTo(new File("path/to/dir","filename.png"));
0
BatteryAcid 18 Фев 2016 в 18:52