L o a d i n g . . .
主打一个C++
文章详情

javascript上传文件以及获取上传进度

Posted on 2024-09-04 00:57:36 by 主打一个C++

//html页面先来一个上传文件的演示按钮:

<input type="file" name="file" id="fileInput">

//监听选择事件,选择后直接测试上传

    document.getElementById('fileInput').addEventListener('change', function(event) {
      const file = event.target.files[0];
      if (file) {
        uploadFile(file);
      }
    });

//第一种:直接上传文件:

function uploadFile(file) {
      const formData = new FormData();
      formData.append('file', file); // 将文件添加到 FormData 对象中
      fetch('/uploads/uploadfile.php', {
          method: 'POST',
          body: formData
        })
        .then(response => response.json())
        .then(data => {
          console.log('上传成功:', data);
        })
        .catch(error => {
          console.error('上传失败:', error);
        });
    }

//第二种:使用xhr带上传进度

function uploadFile(file) {
      const maxFileSize = 1024 * 1024 * 10; // 10MB

      if (file.size > maxFileSize) {
        alert('文件大小不能超过10MB');
        return;
      }

      const formData = new FormData();
      formData.append('file', file); // 将文件添加到 FormData 对象中

      const xhr = new XMLHttpRequest();
      xhr.open('POST', '/uploads/uploadfile.php', true);

      xhr.upload.addEventListener('progress', function(event) {
        if (event.lengthComputable) {
          const percentComplete = (event.loaded / event.total) * 100;
          console.log(`上传进度: ${percentComplete.toFixed(2)}%`);
        }
      });

      xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
          if (xhr.status === 200) {
            try {
              const data = JSON.parse(xhr.responseText);
              alert('上传成功:', data);
            } catch (e) {
              alert('解析响应失败:', e);
            }
          } else {
            alert('上传失败:', xhr.status, xhr.statusText);
          }
        }
      };

      xhr.onerror = function() {
        alert('网络错误或请求被阻止');
      };
      console.log('准备发送请求');
      xhr.send(formData);
    }

//最后是服务端代码,这里使用php

//使用php写出一个测试,确定一下是否来了
$filename = "test.txt";
$content = "上传文件测试";

$fp = fopen($filename, "w");
fwrite($fp, $content);
fclose($fp);

//接收上传代码,支持任意文件上传,补充,判断文件大小,自生成上传密匙,避免恶意的post
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $file = $_FILES['file'];
    if ($file['error'] != UPLOAD_ERR_OK) {
        echo json_encode(['success' => false, 'message' => '文件上传失败']);
        exit;
    }
    $maxFileSize = 1024 * 1024 * 10; //想限制大小,必须在服务端限制,否则,懂得都懂
    $fileSize = $file['size'];
    if ($fileSize > $maxFileSize) {
        echo json_encode(['success' => false, 'message' => '文件大小超过限制']);
        exit;
    }
    $uploadDirectory = $_SERVER['DOCUMENT_ROOT'] . '/uploads/files/';
    $fileName = basename($file['name']);
    $uploadFilePath = $uploadDirectory . $fileName;

    if (move_uploaded_file($file['tmp_name'], $uploadFilePath)) {
        echo json_encode(['success' => true, 'message' => '文件上传成功']);
    } else {
        echo json_encode(['success' => false, 'message' => '文件上传失败']);
    }
} else {
    echo json_encode(['success' => false, 'message' => '无效的请求']);
}

*转载请注明出处:原文链接:https://cpp.vin/page/24.html

作者近期文章
  • 随手笔记
  • 主打一个C++   2025-01-11 20:02:01
  • 都2000000025年了。还有不能随意访问guthub的,仔细看。在国内其实是可以正常访问的,gfw并没屏蔽。这里给出其中一个简单直接的方法稳定访问。1. 随便百度一个”dn
提示
×
确定
数据库执行: 8次 总耗时: 0.01s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog