JavaScript实现图片上传并预览并提交ajax

JavaScript实现图片上传并预览并提交ajax,涉及到以下几个步骤:

  1. 通过input元素选择图片文件;
  2. 使用FileReader API将图片文件转换为base64格式的数据,并将其显示在页面上;
  3. 将base64格式的图片数据发送到服务器端,并接收服务器端的响应。

下面是详细的攻略:

步骤一:选择图片文件

使用HTML中的<input>元素来选择图片文件。这里我们选择 type="file" 的 input 元素。

<input type="file" id="upload" accept="image/*">

其中,id属性用于获取DOM元素,accept属性限制上传的文件格式为图片类型。

然后可以在JS代码中获取该元素,并监听它的change事件:

const upload = document.querySelector('#upload')
upload.addEventListener('change', handleFileSelect, false)

当用户选择了图片文件后,调用handleFileSelect函数,将图片文件传递进去。

步骤二:将图片预览在页面上

使用FileReader API将图片文件转换为base64格式的数据,并将其显示在页面上。

function handleFileSelect() {
  const file = this.files[0]
  const reader = new FileReader()

  reader.onload = event => {
    const img = new Image()
    img.src = event.target.result
    document.body.appendChild(img)
  }

  reader.readAsDataURL(file)
}

handleFileSelect函数中,首先获取用户选择的图片文件,并创建一个FileReader实例对象,然后为该实例对象添加一个onload事件处理函数。当文件读取完成后,该事件处理函数将被调用。

在该事件处理函数中,我们创建一个<img>元素,并将base64格式的图片数据赋值给该元素的src属性。最后将该元素添加到DOM文档中。

现在,我们已经成功将图片文件预览到页面中。

步骤三:提交图片数据到服务器端

最后一步是将图片发送给服务器端,需要使用XMLHttpRequest或fetch API实现ajax请求。

这里我们以fetch API为例:

function handleFileSelect() {
  const file = this.files[0]
  const reader = new FileReader()

  reader.onload = event => {
    const img = new Image()
    img.src = event.target.result
    document.body.appendChild(img)

    fetch('/upload', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ image: event.target.result })
    })
      .then(response => response.json())
      .then(data => console.log(data))
  }

  reader.readAsDataURL(file)
}

在该代码中,我们使用fetch函数发送一个POST请求到服务器端的/upload路由。请求头中设置Content-Typeapplication/json,请求体中包含图片的base64格式的数据。

在服务器端,我们可以接收到该请求,并使用base64格式的数据创建一个图片文件。

示例1:使用Node.js和express框架搭建服务器

const express = require('express')
const bodyParser = require('body-parser')
const fs = require('fs')
const path = require('path')

const app = express()
app.use(bodyParser.json())

app.post('/upload', (req, res) => {
  const image = req.body.image.split(',')[1] // 去掉base64数据前面的"data:image/png;base64,"字符串
  const buffer = Buffer.from(image, 'base64')
  const filename = `image_${Date.now().valueOf()}.png`
  const filepath = path.resolve(__dirname, filename)

  fs.writeFile(filepath, buffer, err => {
    if (err) {
      console.error(err)
      res.status(500).json({ message: 'Server Error' })
    } else {
      res.json({ message: 'File uploaded successfully' })
    }
  })
})

app.listen(8080, () => {
  console.log('Server started at http://localhost:8080')
})

在服务器端,我们使用express框架接收POST请求,并解析请求体中的JSON数据。然后将base64格式的数据转换为Buffer对象,并保存到服务器中。

示例2:使用PHP搭建服务器

<?php
if (isset($_POST['image'])) {
  $image = $_POST['image'];
  $image = str_replace('data:image/png;base64,', '', $image);
  $image = str_replace(' ', '+', $image);
  $data = base64_decode($image);

  $filename = 'image_' . time() . '.png';
  $filepath = './' . $filename;
  file_put_contents($filepath, $data);

  $response = array('message' => 'File uploaded successfully');
  echo json_encode($response);
}
?>

在PHP服务器端,我们通过$_POST全局变量获取请求体中的base64格式的图片数据,并将其转换为二进制数据。然后将二进制数据保存到服务器中,并返回一个JSON响应。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现图片上传并预览并提交ajax - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript实现简单的日历效果

    下面是具体的攻略。 1. 理清需求和思路 在实现日历效果时,我们需要注意以下几个点: 展示一个月的日历,包含每一天的日期和星期几; 给用户提供切换月份的功能; 当天的日期需要特殊标识。 为了实现日历效果,我们需要先通过 JavaScript 获取到当前的年份和月份,然后计算出这个月有多少天,以及这个月的第一天是星期几。最后,我们通过循环渲染 HTML 标签来…

    JavaScript 2023年5月27日
    00
  • JavaScript DOM学习第一章 W3C DOM简介

    JavaScript DOM(Document Object Model)是用于描述文档的抽象表示形式的编程接口,它定义了一组标准对象,这些对象可以与HTML、XML或XHTML文档的元素、文本节点和属性进行交互。 本文主要介绍 W3C DOM (World Wide Web Consortium DOM)的基础知识,包括DOM的版本、DOM树结构、DOM节…

    JavaScript 2023年6月10日
    00
  • 原生JS实现文件上传

    下面是“原生JS实现文件上传”的详细攻略: 1. HTML结构 在HTML文件中添加一个表单,包含一个文件输入和一个提交按钮。 <form enctype="multipart/form-data"> <input type="file" name="fileInput" id=&…

    JavaScript 2023年5月27日
    00
  • javascript学习笔记之函数定义

    下面是关于“javascript学习笔记之函数定义”的完整攻略。 函数定义 函数的定义方式 JavaScript 中定义函数的方式有两种:函数声明和函数表达式。 函数声明 函数声明是通过 function 关键字定义的函数,它可以在任何位置被调用。例如: function add(a, b) { return a + b; } 函数声明定义的函数会被提升到作…

    JavaScript 2023年5月18日
    00
  • 这段js代码得节约你多少时间

    这段JS代码节约了很多处理数组的时间。具体是通过使用Array.reduce()方法来将数组中的元素合并成一个值,从而避免了使用循环操作数组的需要,大大提高了代码效率。 下面是完整的攻略: 1. 理解 Array.reduce() 方法 Array.reduce() 方法是 JavaScript 数组常用的高阶函数之一,它对数组中的所有元素进行迭代,并将它们…

    JavaScript 2023年5月27日
    00
  • 超出JavaScript安全整数限制的数字计算BigInt详解

    超出JavaScript安全整数限制的数字计算BigInt详解 在JavaScript中,数字类型的数据有其取值范围限制。当使用极大或极小的数字时,可能会导致计算结果出现错误。为了解决这个问题,ES2020引入了BigInt类型,可以用来处理任意大的整数。本文讲解BigInt类型相关知识和示例。 什么是BigInt? BigInt是一种特殊的数据类型,可以用…

    JavaScript 2023年5月28日
    00
  • UserData用法总结 lanyu出品

    UserData用法总结 lanyu出品 什么是UserData? UserData 是一种数据结构,它可以用来存储任意类型的数据,并将其附加到 Lua 对象上。在 Lua 中,UserData 可以被视为一个外部对象,类似于指针,但在内部可以存储任何数据。 如何创建 UserData? 假设要给一个对象 obj 附加一个 UserData,并存储一个字符串…

    JavaScript 2023年6月10日
    00
  • 简单通过settimeout看javascript的运行机制

    如何通过 setTimeout 看 JavaScript 的运行机制? JavaScript 是一门单线程语言。也就是说,在浏览器环境下所有的代码只会在一个线程上执行。而 setTimeout 函数可以进行一定的调度,这也是 JavaScript 事件机制的基础。 那么如何通过 setTimeout 来理解 JavaScript 的运行机制呢?下面是一个详细…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部