微信小程序开发(二)图片上传+服务端接收详解

我来为您详细讲解“微信小程序开发(二)图片上传+服务端接收详解”的完整攻略。

文章概述

本文主要介绍微信小程序中图片上传的方法,以及服务端接收图片的实现方法。主要包括以下内容:

  1. 小程序中基于wx.chooseImage()实现图片上传
  2. 服务端使用Node.js and express框架来接收图片并保存

小程序中基于wx.chooseImage()实现图片上传

在微信小程序中,使用wx.chooseImage()方法来选取本地图片并上传到服务器,该方法的主要调用方式如下所示:

wx.chooseImage({
  count: 1,   // 最多可以选择的图片张数
  sizeType: ['original', 'compressed'],  // 可以指定是原图还是压缩图,默认二者都有
  sourceType: ['album', 'camera'],  // 可以指定来源是相册还是相机,默认二者都有
  success: function (res) {
    // 图片上传成功之后的操作
  },
  fail: function (res) {
    // 图片上传失败之后的操作
  }
})

成功选择图片后,我们可以通过wx.uploadFile()方法将图片上传到指定的服务器上,该方法主要调用方式如下所示:

wx.uploadFile({
  url: '服务器地址',    // 上传图片的服务器地址
  filePath: '要上传的图片的本地路径',   // 要上传的图片的本地路径
  name: '图片文件在后台对应的名称,如file',   // 上传图片文件时的参数名称
  formData: {
    'user': 'test'   // 上传图片的其他参数
  },
  success: function (res) {
    //图片上传成功之后的操作
  },
  fail: function (res) {
    //图片上传失败之后的操作
  }
})

下面,举一个实例来说明如何使用wx.chooseImage()方法进行图片上传:

wx.chooseImage({
  count: 1,
  success: function(res) {
    var tempFilePaths = res.tempFilePaths;
    console.log('选择图片的路径为:', tempFilePaths[0]);
    wx.uploadFile({
      url: 'http://localhost:3000/upload',
      filePath: tempFilePaths[0],
      name: 'file',
      header: {
        'content-type': 'multipart/form-data'
      },
      formData: {
        'user': 'test'
      },
      success: function(res) {
        var data = res.data;
        console.log('图片上传成功后的响应内容为:', data);
      },
      fail: function(res) {
        console.log('图片上传失败:', res);
      }
    })
  },
  fail: function(res) {
    console.log('获取图片失败:', res);
  }
})

服务端使用Node.js and express框架来接收图片并保存

服务端使用Node.js and express框架来接收图片并保存的代码实现如下:

const express = require('express');
const bodyParser = require('body-parser');
const multer = require('multer');

const app = express();
const upload = multer({
  storage: multer.diskStorage({
    // 自定义上传位置
    destination: function(req, file, cb) {
      cb(null, './uploads'); // 保存到uploads文件夹下
    },
    // 自定义上传的文件名称
    filename: function(req, file, cb) {
      const fileNameArr = file.originalname.split('.');
      const extensionName = fileNameArr[fileNameArr.length - 1];
      const filename = Date.now() + '_' + Math.floor(Math.random() * (99999 - 10000 + 1) + 10000) + '.' + extensionName;
      cb(null, filename);
    }
  })
});

// 设置允许跨域访问该服务
app.all('*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  next();
});

// 解析post请求参数
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

// 处理上传图片的请求
app.post('/upload', upload.single('file'), function(req, res, next) {
  if(req.file) {
    console.log('文件上传成功:', req.file);
    res.json({
      status: 200,
      message: 'file upload success',
      data: {
        filename: req.file.filename
      }
    });
  } else {
    console.log('文件上传失败:', err);
    res.json({
      status: 500,
      message: 'file upload fail'
    });
  }
});

// 启动服务
app.listen(3000, function() {
  console.log('服务已经启动,可以通过 http://localhost:3000 进行访问');
})

此时,我们就通过使用Node.js and express框架成功实现了服务端的接收图片并保存操作。服务运行起来后,运行如下的测试代码查看图片是否成功上传:

const http = require('http');
const fs = require('fs');
const path = require('path');

const options = {
  hostname: 'localhost',
  port: 3000,
  path: '/upload',
  method: 'POST',
  headers: {
    'Content-Type': 'multipart/form-data'
  }
};

const req = http.request(options, (res) => {
  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(`响应主体: ${chunk}`);
  });
  res.on('end', () => {
    console.log('响应中已无数据。');
  });
});

req.on('error', (e) => {
  console.error(`请求遇到问题: ${e.message}`);
});
const filepath = path.join(__dirname, 'images/avatar.png');
const boundaryKey = Math.random().toString(16);
const enddata = '\r\n----' + boundaryKey + '--';

var fileStream = fs.createReadStream(filepath);
var length = fs.statSync(filepath).size;
req.setHeader('content-type', 'multipart/form-data; boundary=--' + boundaryKey);
req.setHeader('Content-Length', length + Buffer.byteLength(enddata));
req.setHeader('Pragma', 'no-cache');
req.setHeader('Cache-Control', 'no-cache');
fileStream.addListener('data', function(chunk) {
  req.write(chunk);
});

fileStream.addListener('close', function() {
  req.end(enddata);
});

以上就是本篇文章对“微信小程序开发(二)图片上传+服务端接收详解”的完整攻略讲解,希望能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序开发(二)图片上传+服务端接收详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • PHP实现数据分页显示的简单实例

    下面是“PHP实现数据分页显示的简单实例”的完整攻略: 一、准备工作 1. 确定数据源 需要确定需要分页显示的数据,可以是从数据库中查询得到的数据,也可以是从文件中读取的数据等。 2. 准备页面 需要准备一个能够对数据进行分页显示的页面,并进行必要的样式设计。 3. 设计分页算法 需要设计一个能够将数据进行分页的算法,并能够根据用户的请求显示相应的数据。 二…

    PHP 2023年5月27日
    00
  • 七款最流行的PHP本地服务器分享

    下面是“七款最流行的PHP本地服务器分享”的完整攻略。 一、概述 在进行PHP开发之前,我们需要选择一个本地服务器来建立我们的开发环境。本文将列出七款最流行的PHP本地服务器并对它们进行详细的介绍和比较。 二、七款PHP本地服务器介绍 1. XAMPP XAMPP是一个免费的、易于安装的、跨平台的Apache分发版,它包含了PHP、MySQL和Apache等…

    PHP 2023年5月23日
    00
  • PHP页面间传递参数实例代码

    当我们构建一个复杂的网站时,经常需要在不同的页面之间传递数据。PHP页面间传递参数是一种常用的方式,可以帮助我们实现数据共享。 下面是两个示例说明: 示例1 – GET方法传参 从页面A跳转到页面B <!– 在页面A中使用超链接跳转到页面B,并传入参数 –> <a href="pageB.php?name=Tom&ag…

    PHP 2023年5月23日
    00
  • PHP实现下载远程图片保存到本地的方法

    实现下载远程图片保存到本地的方法,可以采用PHP的curl库来实现。具体步骤如下: 步骤一:开启curl扩展 在PHP中使用curl库,需要开启curl扩展。如果你的PHP环境中没有安装curl扩展,可以在php.ini配置文件中添加如下配置: extension=curl.so (Linux) extension=curl.dll (Windows) 步骤…

    PHP 2023年5月27日
    00
  • php 字符串压缩方法比较示例

    当我们处理大量的字符串数据时,为了减小数据的体积,我们通常需要进行字符串压缩。在PHP中,有多种压缩字符串的方法,包括gzip,Deflate和LZF等。下面我将结合示例,详细讲解PHP中的字符串压缩方法比较。 1. gzip压缩 gzip是一种较为常用的字符串压缩方法,它能够在减小文件大小的同时保持文件内容的完整性。PHP内置了gzip压缩函数gzcomp…

    PHP 2023年5月26日
    00
  • php 数组二分法查找函数代码

    PHP中数组二分法查找函数代码: function binary_search($arr, $key) { $low = 0; $high = count($arr) – 1; while ($low <= $high) { $mid = intval(($low + $high) / 2); if ($arr[$mid] > $key) { $…

    PHP 2023年5月25日
    00
  • 一组PHP可逆加密解密算法实例代码

    关于“一组PHP可逆加密解密算法实例代码”的完整攻略,我会在以下三个方面进行讲解: 可逆加密算法的基本概念 PHP实现可逆加密解密的代码逻辑和示例 安全性和注意事项 1. 可逆加密算法的基本概念 可逆加密算法是指可以将明文通过加密算法转化为密文,在需要时通过解密算法将密文恢复为原明文的一类加密方法。相对于不可逆加密算法,可逆加密算法保证了加密数据的可读性,有…

    PHP 2023年5月23日
    00
  • php使用unset()删除数组中某个单元(键)的方法

    当我们想要在PHP中删除数组中某个单元的时候,可以使用unset()函数来实现。该函数用于删除指定键的数组元素。下面是使用unset()函数来删除数组中某个单元的方法和示例说明。 1. unset()函数的作用及语法 unset()函数用来销毁指定变量。在数组中,它可以删除指定键的元素。 unset()函数的语法如下: unset(array $array,…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部