Can't append content to FormData()

Groschenroman

I have two different JS functions to handle image uploads. One to read the file and to (globally) create the FormData object and the other to send it to a PHP file via AJAX.

Even though the file is valid I can't append it to the FormData. And strings neither. And as it turns out I'm only sending empty XHRequests via Ajax, because I don't get any other content from PHP then empty arrays.

Since the first JS function initializes the formData variable globally the second function should have no problems using it, am I right?

My Javascript looks like this (I commented out some unnecessary lines:

   $(document).ready(function(){

      var formUplImg = $('.form-upl-img');
      var fileInput  = $('.file-input');

      // Analyse files from input immediately
      fileInput.on('change', function(){
         readFile($(this).attr('id'));
      })

      // Upload images on submit
      formUplImg.on('submit', function(event) {
         uploadImg($(this), event);
      });



      function readFile(id){
         // Grab file that's supposed to be uploaded
         var fileInput = document.getElementById(id);
         var fileCount = fileInput.files.length;
             formData  = new FormData();

         // If there is no file
         if( fileCount!= 1 ){
            // goodImg    = false;
            // Error message
            // showMsgBar(iClose, 'Da ist nichts.', 'Bitte wähle zuerst eine Datei aus.', red);

         // If there is a file
         } else {
            // Save file attributes
            var file      = fileInput.files[0];
            var fileName  = fileInput.files[0].name;
            var fileSize  = fileInput.files[0].size;
            var fileType  = fileInput.files[0].type;

            // If file is not an image
            if( !fileType.match(/image.*/) ) {
               // goodImg    = false;
               // Error message
               // showMsgBar(iClose, 'Ungültiger Dateityp.', 'Das Bild muss ein JPG, PNG, GIF oder SVG sein.', red);

            // If file is an image
            } else {
               // If file size exceeds 3MB
               if( fileSize > 3145728 ) {
                  // goodImg = false;
                  // Error message
                  // showMsgBar(iClose, 'Das Bild ist zu groß.', 'Die Dateigröße darf max. 3MB betragen.', red);

               // If image file size is ok
               } else {
                  // goodImg = true;
                  // Distinguish img use cases
                  if( fileInput.id.indexOf('icon') > -1 ) {
                     var imgUsage = 'icon'; // round user icon (for usage in header)
                  } else if ( fileInput.id.indexOf('logo') > -1 ) {
                     var imgUsage = 'logo'; // horizontal logo (contributors/admin or corporation logo)
                  } else if ( fileInput.id.indexOf('photo') > -1 ) {
                     var imgUsage = 'photo'; // photo for posts
                  } // img use cases

   console.log(file, imgUsage); // => the file with all attributes + 'icon'
                  formData.append(imgUsage+'_upload_input', file);
                  formData.append('img-usage', imgUsage);
   console.log(file, imgUsage); // => the file with all attributes + 'icon'
               } // /file size is ok
            } // /file is an image
         } // /file is not empty
      } // /readFile()


      function uploadImg($this, event){

         var serialForm = $this.serialize();
   console.log(serialForm.toString()); // => 'user_id=36'
         $.ajax({
            url        : "test-upload.php",
            type       : "POST",
            data       : formData+serialForm, 
            async      : true,
            cache      : false,
            processData: false,
            contentType: false,
            success    : function(callback){

   console.log(callback);
               formdata = new FormData();
            }
         });
         event.preventDefault();

      } // /uploadImg
   }); // /jQuery

HTML

<!DOCTYPE html>
<html lang="de">
<head>
   <meta charset="utf-8" />
   <title>Test</title>
   <script src="js/jquery-2.1.3.min.js" type="text/javascript"></script>
   <script type="text/javascript">
</head>
<body>
   <h1>Test</h1>

            <form action="" method="post" name="form_profile_icon_upload" class="form form-profile form-upl-img form-profile-side-right" id="form-profile-icon-upload" enctype="multipart/form-data">
               <fieldset class="fieldset icon-upload-fieldset" id="profile-icon-upload-fieldset">
                  <legend class="legend">Icon ändern <span class="label-span">(siehe oben)</span></legend>
                     <input type="file" name="icon_upload_input" class="file-input icon-upload-input" id="profile-icon-upload-input" />
                     <p class="form-txt"><strong>Hinweis:</strong><br />
                        Die Dateigröße darf <strong>3 MB</strong> nicht überschreiten. Quadratische Icons eignen sich optimal, sind aber kein Muss.</p>
                     <input type="hidden" name="user_id" value="36" />
                     <button type="submit" name="profile_icon_upl_btn" class="button button-green form-sbmt-btn" id="profile-icon-upl-btn" value="Hochladen">Hochladen</button>
                     <p class="img-del-txt">
                     </p>
               </fieldset>
            </form><!-- Icon upload form -->


</body>
</html>

The PHP file looks like this (for test purposes):

<?php

   if( isset($_POST) && isset($_FILES) ){

print_r($_POST);
echo ($_POST['icon_upload_input']);
print_r($_FILES);
die();

   }

I'm using latest Firefox 35.0 and jQuery 2.1.3. Can anyone help me out?

Musa

Your problem is here data: formData+serialForm,.
FormData must be passed alone, if you want to add data to it use the constructor or append.

function uploadImg($this, event){
    var formData  = new FormData($this[0]); //construct the form data with the form
    ... 
    formData.append(imgUsage+'_upload_input', file);
    formData.append('img-usage', imgUsage);
    ...
        data: formData, //just pass the formdata object

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Can't append content to FormData()

From Dev

FormData append doesn't work

From Dev

jQuery ajax post using FormData() append data element can't find the appended data element after post

From Dev

How can I use the new FormData methods apart from append?

From Dev

FormData doesn`t work when I try to append

From Dev

Can't append JTextArea

From Dev

Why I can't append HTML in <body> from content script for SOME websites from my chrome extension?

From Dev

Append var to FormData

From Dev

Append selected option to FormData

From Dev

Cant append elements to FormData

From Dev

Append data to formData object

From Dev

Checkboxes with FormData.Append

From Dev

Recursion can't append list

From Dev

Faking out FormData append with Jasmine

From Dev

Append cordova fileEntry objet to formData

From Dev

Why doesn't FormData.append File from FileEntry upload correctly?

From Dev

Ajax file upload in Wordpress - can't pass FormData

From Dev

Can't build a FormData object out of existing form

From Dev

Can't insert FormData in mysql using Php and jquery ajax

From Dev

Can't update the content of array

From Dev

HttpResponseMessage can't serialize content

From Dev

Can't center content horizontally

From Dev

Can't append <animateTransform> element to SVG path

From Dev

Can't .append() option to select element

From Dev

Can't append contents of page to parent element

From Dev

PHP: Can't append onto value

From Dev

Can't append html element jquery

From Dev

Can't append blade syntax with JQuery

From Dev

why can't I append to div in ember?