jQuery AJAX ficheiro enviar PHP
quero implementar um simples envio de ficheiros na minha página intranet, com a menor configuração possível.
Esta é a minha parte HTML:
<input id="sortpicture" type="file" name="sortpic" />
<button id="upload">Upload</button>
E este é o meu argumento JS jquery:
$("#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");
}
});
});
existe uma pasta chamada " uploads "no diretório raiz do site, com permissões de mudança para" usuários "e"IIS_users".
Quando selecciono um ficheiro com o formulário de ficheiro e carrego no botão enviar, o primeiro alerta devolve "[object FormData]". o segundo alerta não é chamado. e a pasta "uploads" também está vazia!?
Alguém pode ajudar-me a descobrir o que se passa?também o próximo passo deve ser, mudar o nome do ficheiro com um nome gerado do lado do servidor. Talvez alguém me possa dar uma solução para isto também.
5 answers
Você precisa de um programa que corra no servidor para mover o ficheiro para a pasta de envios. O método jQuery ajax
(rodando no navegador) envia os dados do formulário para o servidor, em seguida, um script no servidor lida com o upload. Aqui está um exemplo usando PHP.
O SEU HTML está bom, mas actualize o seu script jQuery JS para ficar assim:
$('#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 agora para o script do lado do servidor, usando o PHP neste caso.
upload.php : UM programa de PHP que corre no servidor e dirige o ficheiro para o directório de envios:
<?php
if ( 0 < $_FILES['file']['error'] ) {
echo 'Error: ' . $_FILES['file']['error'] . '<br>';
}
else {
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
}
?>
Além disso, algumas coisas sobre o diretório de destino:
- certifique-se que tem a localização correcta do servidor , ou seja, a partir da localização do programa PHP Qual é a localização da pasta uploads, e
- certifica-te que é gravável.
E um pouco sobre a função PHPmove_uploaded_file
, usado no envio .programa de 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']
é a nome do arquivo como ele é carregado. Não tens de usar isso. Poderá indicar ao ficheiro qualquer nome (compatível com o sistema de ficheiros do servidor) que desejar:
move_uploaded_file(
$_FILES['file']['tmp_name'],
'uploads/my_new_filename.whatever'
);
E finalmente, esteja ciente do seu PHP upload_max_filesize
e post_max_size
valores de configuração, e certifique-se de que seus arquivos de teste não excedem qualquer um. Aqui está uma ajuda na forma como você verifica a configuração do PHP e como você define o tamanho máximo dos ficheiros e a configuração do post .
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);
}
});
E este é o ficheiro php para receber os ficheiros uplaoded
<?
$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);
?>
**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" />';
}
Quando seleccionar a imagem, a imagem será convertida na base 64 e poderá guardar isto na base de dados, para que também seja leve.