我发现了一个笔here,我试图实现到我的表格.经过这么多次try ,我意识到它只上传图像通过 Select 文件选项只.如果我try 拖放文件不会发送到我的php代码,但如果我使用它一个 Select 文件,我得到的文件在服务器端. 我不是很擅长js,请帮忙? 下面是我的php代码上传文件到数据库 PHP

if($_POST){
if(isset($_FILES['files']['name'][0]) && $_FILES['files']['size'][0] != 0 && $_FILES['files']['error'][0] == 0) 
        {
         $filesCount = count($_FILES['files']['name']);
         for($i = 0; $i < $filesCount; $i++) { 
            $ext = pathinfo($_FILES['files']['name'][$i], PATHINFO_EXTENSION);

            $new_filename = time().$i.'.'.$ext;
            move_uploaded_file($_FILES['files']['tmp_name'][$i], '../assets/field-photos/'.$new_filename);   
            $allfiles[] = $new_filename;
         }
         $uploaded_img = implode(',',$allfiles);
        }
        else{
            $uploaded_img = '';
        }

        var_dump($uploaded_img);

        }

下面是html表单

<form action="add-products.php" method="POST" enctype="multipart/form-data">
    <input type="text" name="name">
    <input type="text" name="lastname">
    <input type="text" name="product">
    <input type="text" name="city">
    <input type="text" name="address">

  <label for="photo">UPLOAD Photos</label>
  <div id="drop-area">
    <div class="my-form-file ">

      <input type="file"  name="files[]" id="fileElem" multiple accept="image/*" onchange="handleFiles(this.files)">
      <label class="button" for="fileElem"><i class="fe fe-upload fe-24 "></i> Select or drag & drop files</label>
    </div>
    <progress id="progress-bar" max=100 value=0></progress>
    <div id="gallery" /></div>
  </div>
<button type="submit">Submit</button>
</form>

下面是js作为代码

let dropArea = document.getElementById("drop-area")

// Prevent default drag behaviors
;['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
  dropArea.addEventListener(eventName, preventDefaults, false)   
  document.body.addEventListener(eventName, preventDefaults, false)
})

// Highlight drop area when item is dragged over it
;['dragenter', 'dragover'].forEach(eventName => {
  dropArea.addEventListener(eventName, highlight, false)
})

;['dragleave', 'drop'].forEach(eventName => {
  dropArea.addEventListener(eventName, unhighlight, false)
})

// Handle dropped files
dropArea.addEventListener('drop', handleDrop, false)

function preventDefaults (e) {
  e.preventDefault()
  e.stopPropagation()
}

function highlight(e) {
  dropArea.classList.add('highlight')
}

function unhighlight(e) {
  dropArea.classList.remove('active')
}

function handleDrop(e) {
  var dt = e.dataTransfer
  var files = dt.files

  handleFiles(files)
}

let uploadProgress = []
let progressBar = document.getElementById('progress-bar')

function initializeProgress(numFiles) {
  progressBar.value = 0
  uploadProgress = []

  for(let i = numFiles; i > 0; i--) {
    uploadProgress.push(0)
  }
}

function updateProgress(fileNumber, percent) {
  uploadProgress[fileNumber] = percent
  let total = uploadProgress.reduce((tot, curr) => tot + curr, 0) / uploadProgress.length
  console.debug('update', fileNumber, percent, total)
  progressBar.value = total
}

function handleFiles(files) {
  files = [...files]
  initializeProgress(files.length)
  files.forEach(uploadFile)
  files.forEach(previewFile)
}

function previewFile(file) {
  let reader = new FileReader()
  reader.readAsDataURL(file)
  reader.onloadend = function() {
    let img = document.createElement('img')
    img.src = reader.result
    document.getElementById('gallery').appendChild(img)
  }
}

function uploadFile(file, i) {
  var url = 'add-products.php'
  var xhr = new XMLHttpRequest()
  var formData = new FormData()
   xhr.open('POST', url, true)
  xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')

  // Update progress (can be used to show progress indicator)
  xhr.upload.addEventListener("progress", function(e) {
    updateProgress(i, (e.loaded * 100.0 / e.total) || 100)
  })

  xhr.addEventListener('readystatechange', function(e) {
    if (xhr.readyState == 4 && xhr.status == 200) {
      updateProgress(i, 100) // <- Add this
    }
    else if (xhr.readyState == 4 && xhr.status != 200) {
      // Error. Inform the user
    }
  })

  formData.append('upload_preset', 'ujpu6gyk')
  formData.append('file', file)
  xhr.send(formData)
}

推荐答案

为了同时提交文本表单数据(名称、地址等)和多个文件(通过拖放或多个 Select ),您可以在formData.append个时间内处理所有数据.

所以诀窍是

  1. 允许用户通过拖放或多项 Select 添加文件(我已经使用了upload作为上传文件夹,您可以根据您的偏好更改它,只要确保上传文件夹可由系统写入,否则上传将失败)
  2. 允许上述(1)操作无限次重复
  3. 允许用户输入其他文本数据(姓名、地址等)
  4. 当用户点击"提交数据"时,使用aerg来处理上述所有内容

由于我不知道你如何使用文本数据,我已经演示了通过发送一封邮箱的效果,

因此,使用以下HTML

<script>

// declare necessary arrays

allfiles = [];
myfile=[];
xfile=[];
xfilename=[];


// initialize / clear all past array data below

allfiles.length = 0;
myfile.length = 0;
xfile.length = 0;
xfilename.length = 0;

var init=0; 
var init2=0;

var formData = new FormData();

</script>    


<table border=0>
<tr><td>Name: <td><input type="text" name="name" id=name>
<tr><td>Lastname: <td><input type="text" name="lastname" id=lastname>
<tr><td>Product: <td><input type="text" name="product" id=product>
<tr><td>City: <td><input type="text" name="city" id=city>
<tr><td>Address: <td><input type="text" name="address" id=address>
<tr><td colspan=2><input type=button onclick="javascript:uploadFile0();" value="Submit Data">
</table>

<br>
<div id="drop-area">
<p>Upload multiple files with the file dialog or by dragging and dropping images onto the dashed region</p>
    <input type="file"  id="fileElem" multiple  accept="image/*" onchange="handleFiles(this.files)">
    <label class="button" for="fileElem">Select some files</label>
  <progress id="progress-bar" max=100 value=0></progress>
  <div id="gallery" /></div>

</div>

<style>
body {
  font-family: sans-serif;
}
a {
  color: #369;
}
.note {
  width: 500px;
  margin: 50px auto;
  font-size: 1.1em;
  color: #333;
  text-align: justify;
}
#drop-area {
  border: 2px dashed #ccc;
  border-radius: 20px;
  width: 480px;
//  margin: 50px auto;
  padding: 20px;
}
#drop-area.highlight {
  border-color: purple;
}
p {
  margin-top: 0;
}
.my-form {
  margin-bottom: 10px;
}
#gallery {
  margin-top: 10px;
}
#gallery img {
  width: 150px;
  margin-bottom: 10px;
  margin-right: 10px;
  vertical-align: middle;
}
.button {
  display: inline-block;
  padding: 10px;
  background: #ccc;
  cursor: pointer;
  border-radius: 5px;
  border: 1px solid #ccc;
}
.button:hover {
  background: #ddd;
}
#fileElem {
  display: none;
}

</style>


<script>
    // ************************ Drag and drop ***************** //
let dropArea = document.getElementById("drop-area")

// Prevent default drag behaviors
;['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
  dropArea.addEventListener(eventName, preventDefaults, false)   
  document.body.addEventListener(eventName, preventDefaults, false)
})

// Highlight drop area when item is dragged over it
;['dragenter', 'dragover'].forEach(eventName => {
  dropArea.addEventListener(eventName, highlight, false)
})

;['dragleave', 'drop'].forEach(eventName => {
  dropArea.addEventListener(eventName, unhighlight, false)
})

// Handle dropped files
dropArea.addEventListener('drop', handleDrop, false)

function preventDefaults (e) {
  e.preventDefault()
  e.stopPropagation()
}

function highlight(e) {
  dropArea.classList.add('highlight')
}

function unhighlight(e) {
  dropArea.classList.remove('active')
}

function handleDrop(e) {
  var dt = e.dataTransfer
  var files = dt.files

  handleFiles(files)
}

let uploadProgress = []

let progressBar = document.getElementById('progress-bar')

function initializeProgress(numFiles) {
  progressBar.value = 0
  uploadProgress = []

  for(let i = numFiles; i > 0; i--) {
    uploadProgress.push(0)
  }


}

function updateProgress(fileNumber, percent) {
  uploadProgress[fileNumber] = percent
  let total = uploadProgress.reduce((tot, curr) => tot + curr, 0) / uploadProgress.length
  progressBar.value = total
  progressBar.value = 100;
}


function updateProgresscompleted(fileNumber, percent) {
  uploadProgress[fileNumber] = percent
  let total = uploadProgress.reduce((tot, curr) => tot + curr, 0) / uploadProgress.length
  progressBar.value = 100;
}

function handleFiles(files) {

files = [...files]

initializeProgress(files.length)
files.forEach(previewFile)


for(i=0; i < files.length; i++ ) {

allfiles.push(files[i].name);

xfile[init]=files[i];
xfilename[init]=files[i].name;

init++;

}

}



function previewFile(file) {
  let reader = new FileReader()
  reader.readAsDataURL(file)
  reader.onloadend = function() {
    let img = document.createElement('img')
    img.src = reader.result
    document.getElementById('gallery').appendChild(img)
  }
}



function uploadFile0()
{

  for(i=0; i < init; i++ ) {
      init2=i;
      uploadFile1();
    }

}


function uploadFile1() {

  var url = './add-products.php'
  var xhr = new XMLHttpRequest()
  xhr.open('POST', url, true)
 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')

 xhr.upload.addEventListener("progress", function(e) {
   updateProgress(init2, (init2 * 100.0 / init) || 100)
 })

  xhr.addEventListener('readystatechange', function(e) {
    if (xhr.readyState == 4 && xhr.status == 200) {

   updateProgresscompleted();

    var response = xhr.responseText;
    // the above is return data from ajax call

    }
    else if (xhr.readyState == 4 && xhr.status != 200) {

      // Error. Inform the user
      alert("Upload Error!");

    }
  })


formData.append('myfile', xfile[init2], xfilename[init2]);
formData.append('init', init2);
formData.append('name', document.getElementById('name').value);
formData.append('lastname', document.getElementById('lastname').value);
formData.append('product', document.getElementById('product').value);
formData.append('city', document.getElementById('city').value);
formData.append('address', document.getElementById('address').value);


  xhr.send(formData)
}

</script>

并使用以下PHP(add—products.php)

<?php

 $ext = pathinfo($_FILES['myfile']['name'], PATHINFO_EXTENSION);
 $filename = pathinfo($_FILES['myfile']['name'], PATHINFO_FILENAME);
 $new_filename = $filename . "_". time() . '_.' . $ext;

   if (copy($_FILES['myfile']['tmp_name'],'./upload/'.  $new_filename  ) ) { 
       echo "File Uploaded: " .  $_FILES['myfile']['name'] ; 
   }

if ($_POST["init"]==0)
{

$to = "yourname@testdomain.com";
$subject = "Stackoverflow TEST" ;

$txt = "";
$txt .= "Name:"  . $_POST["name"] . "\n";
$txt .= "LastName:"  . $_POST["lastname"] . "\n";
$txt .= "Product:"  . $_POST["product"] . "\n";
$txt .= "City:"  . $_POST["city"] . "\n";
$txt .= "Address:"  . $_POST["address"] . "\n";

$headers = "From: webmaster@example.com" . "\r\n" ;

mail($to,$subject,$txt,$headers);

}
?>

效果将是:

enter image description here

注:

(1)我添加了一个技巧,使PHP将只处理一次文本数据(第一次迭代),因为它是正常的这样做,因为文本数据应该处理一次,但文件上传可以是多个

(2)在实际情况下,我认为你应该考虑使用一个变量将上传的照片链接到文本数据(例如,保存在db表中的文本数据,然后使用insert_record_id链接上传的照片)

Javascript相关问答推荐

在时间轴完整日历中显示日期标题

为什么使用MAX_SAFE_INTEGER生成随机整数时数字分布不准确?

vscode扩展-webView Panel按钮不起任何作用

. NET中Unix时间转换为日期时间的奇怪行为

在网页上添加谷歌亵渎词

Chromium会将URL与JS一起传递到V8吗?

Chart.js-显示值应该在其中的引用区域

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

如何将数组用作复合函数参数?

环境值在.js文件/Next.js中不起作用

当我在Reaction中创建一个输入列表时,我的输入行为异常

当代码另有说明时,随机放置的圆圈有时会从画布上消失

按什么顺序接收`storage`事件?

当我点击一个按钮后按回车键时,如何阻止它再次被点击

FireBase FiRestore安全规则-嵌套对象的MapDiff

用另一个带有类名的div包装元素

使用API调用的VUE 3键盘输入同步问题

对不同目录中的Angular material 表列进行排序

使用Java脚本筛选数组中最接近值最小的所有项

在Reaction Native中,ScrolltoIndex在结束时不一致地返回到索引0