File PHP di jQuery AJAX


159

Voglio implementare un semplice caricamento di file nella mia pagina intranet, con la minima configurazione possibile.

Questa è la mia parte HTML:

<input id="sortpicture" type="file" name="sortpic" />
<button id="upload">Upload</button>

e questo è il mio script jquery JS:

$("#upload").on("click", function() {
    var file_data = $("#sortpicture").prop("files")[0];   
    var form_data = new FormData();
    form_data.append("file", file_data);
    alert(form_data);
    $.ajax({
        url: "/uploads",
        dataType: 'script',
        cache: false,
        contentType: false,
        processData: false,
        data: form_data,                         
        type: 'post',
        success: function(){
            alert("works"); 
        }
    });
});

Esiste una cartella denominata "uploads" nella directory principale del sito Web, con autorizzazioni di modifica per "utenti" e "IIS_users".

Quando seleziono un file con il modulo file e premo il pulsante di caricamento, il primo avviso restituisce "[object FormData]". il secondo avviso non viene chiamato e anche la cartella "uploads" è vuota !?

Qualcuno può aiutarmi a scoprire cosa c'è che non va?

Dovrebbe essere anche il passaggio successivo, per rinominare il file con un nome generato dal lato server. Forse qualcuno può darmi una soluzione anche per questo.


Si prega di leggere prima questo: stackoverflow.com/questions/166221/…
Vincent Decaux,

Tutto funziona per me, forse è il tuo codice PHP?
Korikulum,

non c'è nient'altro "connesso" con questo modulo. cosa intendi con il mio codice php?
user2355509

Voglio dire, il tuo codice funziona, forse il problema è nel tuo codice lato server.
Korikulum,

Stai ricevendo un codice di errore 500 durante l'esecuzione dello script AJAX? Ciò indicherebbe che si tratta di un errore lato server. Inoltre: assicurati che durante il debug, produci la risposta del file PHP sulla console. In questo modo, se il tuo codice PHP genera un errore, sai cosa sta succedendo.
Diederik,

Risposte:


286

È necessario uno script eseguito sul server per spostare il file nella directory dei caricamenti. Il ajaxmetodo jQuery (in esecuzione nel browser) invia i dati del modulo al server, quindi uno script sul server gestisce il caricamento. Ecco un esempio usando PHP.

Il tuo HTML va bene, ma aggiorna il tuo script JS jQuery in questo modo:

$('#upload').on('click', function() {
    var file_data = $('#sortpicture').prop('files')[0];   
    var form_data = new FormData();                  
    form_data.append('file', file_data);
    alert(form_data);                             
    $.ajax({
        url: 'upload.php', // point to server-side PHP script 
        dataType: 'text',  // what to expect back from the PHP script, if anything
        cache: false,
        contentType: false,
        processData: false,
        data: form_data,                         
        type: 'post',
        success: function(php_script_response){
            alert(php_script_response); // display response from the PHP script, if any
        }
     });
});

E ora per lo script lato server, usando PHP in questo caso.

upload.php : uno script PHP che viene eseguito sul server e indirizza il file nella directory dei caricamenti:

<?php

    if ( 0 < $_FILES['file']['error'] ) {
        echo 'Error: ' . $_FILES['file']['error'] . '<br>';
    }
    else {
        move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
    }

?>

Inoltre, un paio di cose sulla directory di destinazione:

  1. Assicurati di avere il percorso del server corretto , ovvero, iniziando dalla posizione dello script PHP qual è il percorso della directory dei caricamenti, e
  2. Assicurati che sia scrivibile .

E un po 'sulla funzione PHP move_uploaded_file, usata nello script upload.php :

move_uploaded_file(

    // this is where the file is temporarily stored on the server when uploaded
    // do not change this
    $_FILES['file']['tmp_name'],

    // this is where you want to put the file and what you want to name it
    // in this case we are putting in a directory called "uploads"
    // and giving it the original filename
    'uploads/' . $_FILES['file']['name']
);

$_FILES['file']['name']è il nome del file mentre viene caricato. Non devi usarlo. Puoi dare al file qualsiasi nome (compatibile con il filesystem del server) che desideri:

move_uploaded_file(
    $_FILES['file']['tmp_name'],
    'uploads/my_new_filename.whatever'
);

Infine, fai attenzione ai valori di configurazione di PHP upload_max_filesizeAND post_max_sizee assicurati che i tuoi file di test non superino nessuno dei due. Ecco alcuni suggerimenti su come controllare la configurazione di PHP e su come impostare le dimensioni massime del file e pubblicare le impostazioni .


hey BloodyKnuckles! grazie, penso che questa sia stata una grande cosa, ho frainteso. Quindi ho aggiunto il file php e ora sono un po 'più vicino. Viene visualizzato anche il secondo avviso! ma la cartella è ancora vuota.
user2355509

Ah, il nome di input del modulo "sortpic" viene modificato in "file" nella form_data.appendfunzione. Quindi ho modificato lo script PHP per riflettere il nuovo nome di input del modulo. Ho anche inserito la risposta dello script PHP nell'avviso di successo ajax per aiutare con il debug.
bloodyKnuckles,

1
Amico, mi dà un file di indice indefinito a$_FILES['file']
Hendry Tanaka,

1
@partho, il codice prop ('files') [0] accede al file locale destinato al caricamento sul server. Se hai bisogno di maggiori spiegazioni, cerca la funzione jQuery "prop" e "upload file html5".
bloodyKnuckles,

1
Ho risolto questo problema. Il motivo era che la dimensione del file era troppo grande.
Ron Tornambe,

4
**1. index.php**
<body>
    <span id="msg" style="color:red"></span><br/>
    <input type="file" id="photo"><br/>
  <script type="text/javascript" src="jquery-3.2.1.min.js"></script>
  <script type="text/javascript">
    $(document).ready(function(){
      $(document).on('change','#photo',function(){
        var property = document.getElementById('photo').files[0];
        var image_name = property.name;
        var image_extension = image_name.split('.').pop().toLowerCase();

        if(jQuery.inArray(image_extension,['gif','jpg','jpeg','']) == -1){
          alert("Invalid image file");
        }

        var form_data = new FormData();
        form_data.append("file",property);
        $.ajax({
          url:'upload.php',
          method:'POST',
          data:form_data,
          contentType:false,
          cache:false,
          processData:false,
          beforeSend:function(){
            $('#msg').html('Loading......');
          },
          success:function(data){
            console.log(data);
            $('#msg').html(data);
          }
        });
      });
    });
  </script>
</body>

**2.upload.php**
<?php
if($_FILES['file']['name'] != ''){
    $test = explode('.', $_FILES['file']['name']);
    $extension = end($test);    
    $name = rand(100,999).'.'.$extension;

    $location = 'uploads/'.$name;
    move_uploaded_file($_FILES['file']['tmp_name'], $location);

    echo '<img src="'.$location.'" height="100" width="100" />';
}

2
var formData = new FormData($("#YOUR_FORM_ID")[0]);
$.ajax({
    url: "upload.php",
    type: "POST",
    data : formData,
    processData: false,
    contentType: false,
    beforeSend: function() {

    },
    success: function(data){




    },
    error: function(xhr, ajaxOptions, thrownError) {
       console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
    }
});

0

e questo è il file php per ricevere i file aggiornati

<?
$data = array();
    //check with your logic
    if (isset($_FILES)) {
        $error = false;
        $files = array();

        $uploaddir = $target_dir;
        foreach ($_FILES as $file) {
            if (move_uploaded_file($file['tmp_name'], $uploaddir . basename( $file['name']))) {
                $files[] = $uploaddir . $file['name'];
            } else {
                $error = true;
            }
        }
        $data = ($error) ? array('error' => 'There was an error uploading your files') : array('files' => $files);
    } else {
        $data = array('success' => 'NO FILES ARE SENT','formData' => $_REQUEST);
    }

    echo json_encode($data);
?>

Che cosa sta if (true)facendo? La valutazione è sempre vera, quindi è inutile, no? Inoltre hai un extra-ricci.
Mr.Web

L'ho riparato per te. :)
Mr.Web

0

Usa js puri

async function saveFile() 
{
    let formData = new FormData();           
    formData.append("file", sortpicture.files[0]);
    await fetch('/uploads', {method: "POST", body: formData});    
    alert('works');
}
<input id="sortpicture" type="file" name="sortpic" />
<button id="upload" onclick="saveFile()">Upload</button>
<br>Before click upload look on chrome>console>network (in this snipped we will see 404)

Il nome file viene automaticamente incluso per la richiesta e il server può leggerlo, il "tipo di contenuto" viene automaticamente impostato su "multipart / form-data". Ecco un esempio più sviluppato con gestione degli errori e invio json aggiuntivo


-1

Miglior caricamento di file utilizzando Jquery Ajax con Materialise Fare clic qui per scaricare

Quando si seleziona l'immagine, l'immagine verrà convertita nella base 64 e sarà possibile memorizzarla nel database in modo che sia leggera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.