react 实现图片上传功能

首先我们需要进入ant-design文档中,找到upload组件

import React from "react";
import { Upload, Modal } from 'antd';
import { PlusOutlined } from '@ant-design/icons';

function getBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => reject(error);
  });
}

export default class PicturesWall extends React.Component {
  state = {
    previewVisible: false,
    previewImage: '',
    previewTitle: '',
    fileList: [],
  };

  handleCancel = () => this.setState({ previewVisible: false });

  handlePreview = async file => {
    if (!file.url && !file.preview) {
      file.preview = await getBase64(file.originFileObj);
    }

    this.setState({
      previewImage: file.url || file.preview,
      previewVisible: true,
      previewTitle: file.name || file.url.substring(file.url.lastIndexOf('/') + 1),
    });
  };

  handleChange = ({ fileList }) => this.setState({ fileList });

  render() {
    const { previewVisible, previewImage, fileList, previewTitle } = this.state;
    const uploadButton = (
      <div>
        <PlusOutlined />
        <div style={{ marginTop: 8 }}>Upload</div>
      </div>
    );
    return (
      <>
        <Upload
          action={`${HOST}:${PORT}/goods/upload`}  //和后台接口对应一致,这是我自己的接口,大家自行设置
          listType="picture-card"
          fileList={fileList}
          onPreview={this.handlePreview}
          onChange={this.handleChange}
        >
          {fileList.length >= 8 ? null : uploadButton}
        </Upload>
        <Modal
          visible={previewVisible}
          title={previewTitle}
          footer={null}
          onCancel={this.handleCancel}
        >
          <img alt="example" style={{ width: '100%' }} src={previewImage} />
        </Modal>
      </>
    );
  }
}

这样一个简单的上传页面就能看到了
在这里插入图片描述
那么接下来如何实现将图片发送到后台服务器?

第一步:下载connect-multiparty组件
第二步: 导入上传中间件并创建上传中间件对象

const multiparty = require('connect-multiparty'); 
const multipartyMiddleWare = multiparty(); 

图上上传接口:goodsapi.js

/*
   图片上传接口:http://localhost:8089/goods/upload
*/
router.post('/upload',multipartyMiddleWare,(req, res) => {
    //输出上传文件的名称(测试)
    console.log("上传文件名:",req.files.photoContent.name)
    //获取上传文件
    let file = req.files.photoContent;   //将上传文件保留在临时文件中
    //设置上传文件的保存位置
    let desc_dir = path.join(__dirname+'../../../public/images')+'\\'+file.originalFilename
    console.log("保存路径:",desc_dir)
    //将临时文件中的数据复制到保存位置
    fs.readFile(file.path,function (err,data) {
        fs.writeFile(desc_dir,data,function (err) {
            if (err){
                console.log(err)
                res.json({
                    code: 1002,
                    msg: '写入文件失败'
                })
            }
        })
    })

    //将上传图片的存储路径响应给客户端
    res.json({
        code: 1000,
        ImgPath: `http://localhost:8089/images/${file.originalFilename}`//网络访问时,public是虚拟目录,不需要写出来
    })
})

图片上传成功后在后台服务器能呈现出来文件名
在这里插入图片描述

### 如何使用React实现图片上传功能 #### 使用Ant Design实现图片上传 对于仅需提供图片上传这一项功能的应用程序而言,可以利用`ant design`提供的现成组件来简化开发流程。此方法只需在组件的`action`属性中指定后端接口地址即可完成基本设置[^1]。 ```jsx import { Upload, message } from 'antd'; import { InboxOutlined } from '@ant-design/icons'; const { Dragger } = Upload; const props = { name: 'file', multiple: true, action: 'https://example.com/upload', // 后端接收URL onChange(info) { const { status } = info.file; if (status !== 'uploading') { console.log(info.file, info.fileList); } if (status === 'done') { message.success(`${info.file.name} 文件上传成功.`); } else if (status === 'error') { message.error(`${info.file.name} 文件上传失败.`); } }, }; function App() { return ( <Dragger {...props}> <p className="ant-upload-drag-icon"> <InboxOutlined /> </p> <p className="ant-upload-text">点击或将文件拖拽至此处上传</p> </Dragger> ); } ``` #### 利用React Images Uploader库增强体验 为了获得更丰富的交互效果以及更好的兼容性和灵活性,可以选择专门针对React优化过的第三方库——`React Images Uploader`。该插件不仅能够处理单张或多张照片的同时提交操作,还允许自定义样式和其他行为参数,从而更好地适应不同场景下的需求[^2]。 ```bash npm install react-images-uploader --save ``` ```jsx import React from "react"; import ReactDOM from "react-dom/client"; import ImageUploader from "react-images-uploader"; // Import CSS file to style the component. import "react-images-uploader/styles.css"; class Example extends React.Component { render () { return( <ImageUploader withIcon={true} buttonText='选择图片' onChange={(pictures) => console.log(pictures)} imgExtension={['.jpg','.gif','.png','.jpeg']} maxFileSize={5242880} /> ) } } const rootElement = document.getElementById("root"); ReactDOM.createRoot(rootElement).render(<Example />); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值