React上传图片

使用vant组件

import React, { FC, useState } from 'react';
import '@/pages/golobo.less';
import 'lib-flexible';
import './index.less';
import { LeftOutline } from 'antd-mobile-icons';
import { history } from 'umi';
import { Button, Input, Rate, Uploader, Form } from 'react-vant';
import { upload, demoData } from './temp';
import axios from 'axios';
import { Toast } from 'antd-mobile';
export default function index() {
  const [form] = Form.useForm();
  const onFinish = async (values: any) => {
    console.log(values, 'form');
    let { data } = await axios.post('/api/gj/addFunctionSugg', values);
    if (data.code == 200) {
      Toast.show({
        icon: 'success',
        content: data.msg,
      });
      history.push('/feedback');
    }
  };

  return (
    <div className="FunctionSuggestion">
      <div className="top">
        <div className="backBtn">
          <LeftOutline
            fontSize={12}
            onClick={() => history.push('/feedback')}
          />
        </div>
        <div className="title">功能异常反馈</div>
      </div>

      <Form
        colon
        form={form}
        onFinish={onFinish}
        footer={
          <div style={{ margin: '16px 16px 0' }}>
            <Button
              round
              nativeType="submit"
              type="primary"
              block
              style={{ background: 'rgb(67, 183, 43)', border: '0' }}
            >
              提交
            </Button>
          </div>
        }
      >
        <Form.Item name="title" label="标题">
          <Input placeholder="问题概述、类型" />
        </Form.Item>

        <Form.Item name="rate" label="评分" initialValue={3}>
          <Rate />
        </Form.Item>

        <Form.Item name="detail" label="问题描述">
          <Input.TextArea rows={3} autoSize maxLength={140} showWordLimit />
        </Form.Item>

        <Form.Item
          name="img"
          label="测试"
          rules={[{ required: true, message: '请选择文件' }]}
        >
          <Uploader upload={upload} />
        </Form.Item>
      </Form>
    </div>
  );
}


.FunctionSuggestion {
  height: 100%;
  width: 100%;
  .top {
    width: 100%;
    padding: 10px 15px;
    box-sizing: border-box;
    display: flex;
    background-color: #f2f2f2;

    .backBtn {
      font-weight: bolder;
    }
    .title {
      font-weight: bolder;
      flex: 1;
      text-align: center;
    }
  }
}


//temp.tsx

// 实际业务中需要自己实现对应上传逻辑
export const upload = async (file: File) => {
  try {
    const body = new FormData();
    body.append('source', file);
    const resp = await fetch('/api/ljr/img', {
      method: 'POST',
      body,
    });
    const json = await resp.json();
    // return包含 url 的一个对象 例如: {url:'https://img.yzcdn.cn/vant/sand.jpg'}
    return { url: 'http://localhost:3000/' + json.imgurl };
  } catch (error) {
    return { url: `demo_path/${file.name}` };
  }
};

export const demoData = [
  {
    url: 'https://img.yzcdn.cn/vant/sand.jpg',
    filename: '图片名称',
  },
  {
    url: 'https://img.yzcdn.cn/vant/tree.jpg',
    filename: '图片名称',
  },
];


//接口
// 图片上传
router.post('/img',async(req,res)=>{
  let form = new multiparty.Form()
form.uploadDir = "upload"//在服务器下创建一个upload目录
form.parse(req,(err,data,files)=>{
  console.log(files,'图片信息')
  
  // 表示上传的图片信息
  // data 表示提交的其它表单数据
  res.send({
    imgurl:files["source"][0].path
  })     
})
})


//添加功能建议接口
router.post('/addFunctionSugg',async(req,res)=>{
    let body=req.body
    await functionSuggestionModule.create({
        title:body.title,
        rate:body.rate,
        img:body.img[0].url,
        detail:body.detail
    })

    res.send({
      code:200,
      msg:'添加功能建议成功'
    })
})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您使用React编写前端页面,并且需要上图片并压缩,可以使用以下步骤: 1. 安装用于图片压缩的库,如`compressorjs`或`react-image-file-resizer`。 2. 创建一个组件来上图片,可以使用`<input type="file">`元素。 3. 当用户选择图片时,可以将其读入内存并压缩。 4. 压缩完毕后,将压缩后的图像作为文件上。 以下是一个简单的示例代码: ```javascript import React, { useState } from 'react'; import Compressor from 'compressorjs'; const UploadImage = () => { const [file, setFile] = useState(null); const handleFileChange = (event) => { const imageFile = event.target.files[0]; new Compressor(imageFile, { quality: 0.6, success(result) { setFile(result); }, error(err) { console.log(err.message); }, }); }; const handleUpload = () => { // 将压缩后的图像作为文件上 const formData = new FormData(); formData.append('image', file); // 发送formData到服务器 }; return ( <div> <input type="file" onChange={handleFileChange} /> <button onClick={handleUpload}>上图片</button> </div> ); }; export default UploadImage; ``` 在这个示例中,我们使用`compressorjs`库来压缩图像。`handleFileChange`函数会在用户选择图片后调用,将图片读入内存并压缩,然后将压缩后的图像设置为组件状态的`file`属性。 `handleUpload`函数在用户点击“上图片”按钮时调用,将压缩后的图像作为文件上。您可以将`formData`发送到服务器并在服务器端进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值