Использование FormData для отправки изображения на бэкэнд [дубликат]

Я думаю, что нашел очень простой способ сделать глубокую копию ArrayList. Предполагая, что вы хотите скопировать массив String ArrayList.

ArrayList<String>arrayB = new ArrayList<String>();
arrayB.addAll(arrayA);

Сообщите мне, если это не сработает для вас.

20
задан panagulis72 4 May 2016 в 23:34
поделиться

5 ответов

Не сериализуйте FormData с POST на сервере. Сделайте это:

this.uploadFileToUrl = function(file, title, text, uploadUrl){
    var payload = new FormData();

    payload.append("title", title);
    payload.append('text', text);
    payload.append('file', file);

    return $http({
        url: uploadUrl,
        method: 'POST',
        data: payload,
        //assign content-type as undefined, the browser
        //will assign the correct boundary for us
        headers: { 'Content-Type': undefined},
        //prevents serializing payload.  don't do it.
        transformRequest: angular.identity
    });
}

Затем используйте его:

MyService.uploadFileToUrl(file, title, text, uploadUrl).then(successCallback).catch(errorCallback);
51
ответ дан biology.info 20 August 2018 в 11:13
поделиться
  • 1
    он дает мне 500 внутренних ошибок сервера lol – panagulis72 5 May 2016 в 00:08
  • 2
    Проблема на вашем заднем контроллере. Не Javascript. – Kyle 5 May 2016 в 00:16
  • 3
    Я не управляю бэкэнд-сайтом, я попрошу моего друга, который это сделает. Постскриптум вы написали fd.append, но я полагаю, что они все полезны. – panagulis72 5 May 2016 в 00:25
  • 4
    да, точно так же, как мой ответ – scyrizales 5 May 2016 в 00:30
  • 5
    Да. Виноват. Полезная нагрузка - fd – Kyle 5 May 2016 в 00:30

Вы отправляете JSON-форматированные данные на сервер, который не ожидает этого формата. Вы уже предоставили формат, который нужен серверу, поэтому вам нужно отформатировать его самостоятельно, что довольно просто.

var data = '"title='+title+'" "text='+text+'" "file='+file+'"';
$http.post(uploadUrl, data)
1
ответ дан Dr. Cool 20 August 2018 в 11:13
поделиться
  • 1
    Поскольку в моей службе я написал: var data = '& quot; title =' + title + '& quot; "text = '+ text +' & quot; & quot; файл = '+ файл +' & quot; '; $ http.post (uploadUrl, data, {transformRequest: angular.identity, headers: {'Content-Type': 'multipart / form-data'}}), и ответ: & quot; Ошибка многопараметрического анализа формы - Недопустимая граница в multipart: None & quot; .. фактически, если я вижу запрос полезной нагрузки, это: & quot; title = Aasd & quot; & Quot; текст = njkopè & Quot; & Quot; файл = не определено & Quot; ...Зачем? – panagulis72 4 May 2016 в 23:51
  • 2
    Я немного изменил код. Теперь он использует параметры, передаваемые в функцию uploadFileToUrl, которая будет включать в себя "файл" параметр. Попробуй это. – Dr. Cool 4 May 2016 в 23:55
  • 3
    Всегда не определено ...: // – panagulis72 5 May 2016 в 00:06

Вот полное решение

html code,

создает поля для загрузки текстовых файлов anf, как показано ниже

    <div class="form-group">
        <div>
            <label for="usr">User Name:</label>
            <input type="text" id="usr" ng-model="model.username">
        </div>
        <div>
            <label for="pwd">Password:</label>
            <input type="password" id="pwd" ng-model="model.password">
        </div><hr>
        <div>
            <div class="col-lg-6">
                <input type="file" file-model="model.somefile"/>
            </div>


        </div>
        <div>
            <label for="dob">Dob:</label>
            <input type="date" id="dob" ng-model="model.dob">
        </div>
        <div>
            <label for="email">Email:</label>
            <input type="email"id="email" ng-model="model.email">
        </div>


        <button type="submit" ng-click="saveData(model)" >Submit</button>

директивный код

создать директиву filemodel для анализа файла

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

Код службы

]

добавьте файл и поля для формирования данных и сделайте $ http.post, как показано ниже, чтобы сохранить «Content-Type»: undefined

 .service('fileUploadService', ['$http', function ($http) {
    this.uploadFileToUrl = function(file, username, password, dob, email, uploadUrl){
        var myFormData = new FormData();

        myFormData.append('file', file);
        myFormData.append('username', username);
        myFormData.append('password', password);
        myFormData.append('dob', dob);
        myFormData.append('email', email);


        $http.post(uploadUrl, myFormData, {
            transformRequest: angular.identity,
            headers: {'Content-Type': undefined}
        })
            .success(function(){

            })
            .error(function(){
            });
    }
}]);

В контроллере

Теперь в контроллере вызов службы, посылая необходимые данные, добавляемые в параметры,

$scope.saveData  = function(model){
    var file = model.myFile;
    var uploadUrl = "/api/createUsers";
    fileUpload.uploadFileToUrl(file, model.username, model.password, model.dob, model.email, uploadUrl);
};
3
ответ дан JpG 20 August 2018 в 11:13
поделиться

Используя $resource в AngularJS, вы можете сделать:

task.service.js

$ngTask.factory("$taskService", [
    "$resource",
    function ($resource) {
        var taskModelUrl = 'api/task/';
        return {
            rest: {
                taskUpload: $resource(taskModelUrl, {
                    id: '@id'
                }, {
                    save: {
                        method: "POST",
                        isArray: false,
                        headers: {"Content-Type": undefined},
                        transformRequest: angular.identity
                    }
                })
            }
        };
    }
]);

И затем использовать его в модуле:

task.module.js

$ngModelTask.controller("taskController", [
    "$scope",
    "$taskService",
    function (
        $scope,
        $taskService,
    ) {
    $scope.saveTask = function (name, file) {
        var newTask,
            payload = new FormData();
        payload.append("name", name);
        payload.append("file", file);
        newTask = $taskService.rest.taskUpload.save(payload);
        // check if exists
    }
}
0
ответ дан regiea 20 August 2018 в 11:13
поделиться

Это никогда не сработает, вы не можете укрепить свой объект FormData.

Вы должны сделать это:

this.uploadFileToUrl = function(file, title, text, uploadUrl){
   var fd = new FormData();
   fd.append('title', title);
   fd.append('text', text);
   fd.append('file', file);

     $http.post(uploadUrl, obj, {
       transformRequest: angular.identity,
       headers: {'Content-Type': undefined}
     })
  .success(function(){
    blockUI.stop();
  })
  .error(function(error){
    toaster.pop('error', 'Errore', error);
  });
}
0
ответ дан scyrizales 20 August 2018 в 11:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: