2016-06-16 13 views
1

Ich habe eine Foto-Upload-Seite, die Drag-and-Drop-Funktionalität ermöglicht.FormData senden leere Datei Feld beim Anhängen von Dateien per Drag & Drop

ist die Form hier:

<form id="Upload" method="post" action="sessionapi/UserPicture/Upload" enctype="multipart/form-data"> 
 
    <input class="box__file" type="file" name="files[]" id="file" data-multiple-caption="{count} files selected" multiple /> 
 
    <input type="hidden" name="UserPictureReferenceID" value="<%=mPictureGalleryCvm.UserPictureReference.UserPictureReferenceID%>" /> 
 
    <input type="hidden" name="UserPictureReferenceType" value="<%=mPictureGalleryCvm.UserPictureReference.UserPictureReferenceType%>" /> 
 
    <div id="photoUploadArea" class="hide"> 
 
    <div id="photoDropArea"> 
 
     <h2>Add Up to 10 photos</h2> 
 
     <p class="subTitle">Your file must be a JPEG, PNG, or GIF</p> 
 
     <p><img src="img/mascotLeftNoResults.png" /></p> 
 
     <h3>Drag and Drop Photos Here</h3> 
 
     <div class="hr-line"> 
 
     <h3><span>OR</span></h3> 
 
     </div> 
 
     <div id="photoUploadButton"> 
 
     <input id="files" class="fileUploadInput hide" type="file" multiple=""> 
 
     <button class="fileBrowserButton" type="submit" value="submit"><span>Browse Files</span></button> 
 
\t \t <script> 
 
\t \t  $('.fileBrowserButton').on('click', function (e) { 
 
\t \t   e.preventDefault(); 
 
\t \t   $("#file").click(); 
 
\t \t  }) 
 
\t \t </script> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</form>

Die Funktion ist hier die Daten über AJAX senden:

function handleFileSelect(evt) { 
 
    evt.stopPropagation(); 
 
    evt.preventDefault(); 
 
    var ajaxData = new FormData($form.get(0)), 
 
     $input = $form.find('input[type="file"]'), 
 
     files; 
 
    if (evt.type == 'change') files = evt.target.files; 
 
    else files = evt.originalEvent.dataTransfer.files; // FileList object. 
 
    for (var i = 0, f; f = files[i]; i++) { //Loop through selected images 
 
     if (!f.type.match('image.*')) { //check file is an image 
 
      continue; 
 
     } 
 
     var reader = new FileReader(); 
 
     reader.onload = (function (theFile) { 
 
      return function (e) { 
 
       if (files && evt.type != 'change') { 
 
        $.each(files, function (i, file) { //problem is here 
 
         ajaxData.append($input.attr('name'), file); 
 
        }); 
 
       } 
 
       $.ajax({ 
 
        url: 'sessionapi/UserPicture/Upload', 
 
        method: 'POST', 
 
        data: ajaxData, 
 
        cache: false, 
 
        contentType: false, 
 
        processData: false, 
 
        success: function(data) { 
 
         console.log(data); 
 
        } 
 
       }) 
 
      }; 
 
     })(f); 
 

 
     // Read in the image file as a data URL. 
 
     reader.readAsDataURL(f); 
 
    } 
 
}

Das wi Problem th der Code mit dem Bereich, in dem Code JS ist.

$.each(files, function (i, file) { 
 
    ajaxData.append($input.attr('name'), file); 
 
});

ajaxData eine Datei eingegeben Formdata für die neue Datei anhängt, die in geschleppt wurde Wenn jedoch wird die Datei über Ajax vorgelegt , es sendet die leere "Datei" Eingabe bereits im Formular. Ich muss alle Felder ohne das leere Dateifeld per Drag & Drop senden. Wie mache ich das?

+1

haben Sie versucht, das html-Formularattribut zum Dateieingang hinzuzufügen? Wenn Sie einen anderen Formularnamen angeben, sollte dieser von diesem ignoriert werden. – Manatax

+0

Nicht sicher, dass ich dir folge. –

+0

Jedes Element in einem Formular wird standardmäßig dem enthaltenden Formular zugewiesen. Sie können das jedoch überschreiben, indem Sie das Formularattribut des Elements selbst manuell festlegen. – Manatax

Antwort

0

Haben Sie versucht, das html-Formularattribut zum Dateieingang hinzuzufügen? Wenn Sie einen anderen Formularnamen angeben, sollte dieser von diesem ignoriert werden.

<input id="files" form="someRandomName" ... > 

EDIT:

Ja, können Sie auch den Eingang entfernen, wenn es nicht das Formular Attribut nicht nehmen.

+0

Diese Lösung funktioniert überall außer Edge und IE. –

+0

Ich habe das Problem behoben, indem ich die Eingabe vor dem Erstellen des FormData-Objekts löschte, wenn ein Foto in den Bereich verschoben wurde. Ihre Antwort hat mich jedoch auf den richtigen Weg geführt. Wenn Sie Ihre Antwort anfügen, um meine Lösung widerzuspiegeln, markieren Sie sie als korrekt. –