首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当上传一个文件以作出反应时,我可以获得上传的进度,但无法将其传递回进度条。定制钩子在这里有用吗?

当上传一个文件以作出反应时,我可以获得上传的进度,但无法将其传递回进度条。定制钩子在这里有用吗?
EN

Stack Overflow用户
提问于 2022-08-24 14:57:26
回答 2查看 494关注 0票数 1

我有一个材料-ui LinearDeterminate进度条,我想传递的上传有多远。

代码语言:javascript
复制
const LinearDeterminate = ({ uploadPercentage, setuploadPercentage }) => {
  const classes = useStyles();
  const [uploadPercentage, setuploadPercentage] = useState("");

  console.log(uploadPercentage);

  return (
    <div className={classes.root}>
      <LinearProgress variant="determinate" value={uploadPercentage} />
    </div>
  );
};

...
    <UploadInput
      path={`customer_creatives/assets/${customer_id}/${new Date().getTime()}`}
      onChange={(value) =>
        updateFieldHandler("link_to_assets")({ target: { value } })
      }
      value={submissionData["link_to_assets"] || ""}
      label="Link to Assets"
      sublabel="*Zip files before uploading"
      isImage={false}
    />
    <LinearDeterminate />
...

UploadInput是一个自定义的输入组件,它链接到DropZone (在那里进行上传)

代码语言:javascript
复制
import React, { useState } from "react";
import ReactDropzone from "react-dropzone";
import axios from "axios";
import { noop } from "lodash";

import HelpDialog from "components/HelpDialog";
import { API_URL } from "config";

const Dropzone = ({
  path,
  onChange = noop,
  children,
  multiple = false,
  maxSize,
  sizeHelper,
  ...props
}) => {
  const [url, setUrl] = useState("");
  const [loading, setLoading] = useState("");
  const [uploadPercentage, setuploadPercentage] = useState("");
  const [sizeHelperOpen, setSizeHelperOpen] = useState(false);
  const onDrop = ([file]) => {
    const contentType = file.type; // eg. image/jpeg or image/svg+xml
    console.log(file);
    if (maxSize && maxSize < file.size) {
      setSizeHelperOpen(true);
      return;
    }

    const generatePutUrl = `${API_URL}/generate-put-url`;
    const generateGetUrl = `${API_URL}/generate-get-url`;
    const options = {
      onUploadProgress: (progressEvent) => {
        //console.log("progressEvent.loaded " + progressEvent.loaded)
        //console.log("progressEvent.total " + progressEvent.total)
        let percent = Math.round(
          (progressEvent.loaded / progressEvent.total) * 100
        );
        setuploadPercentage({
          uploadPercentage: percent,
        });
        console.log(uploadPercentage);
      },
      params: {
        Key: path,
        ContentType: contentType,
      },
      headers: {
        "Content-Type": contentType,
      },
    };

    setUrl(URL.createObjectURL(file));
    setLoading(true);

    axios.get(generatePutUrl, options).then((res) => {
      const {
        data: { putURL },
      } = res;
      axios
        .put(putURL, file, options)
        .then(() => {
          axios.get(generateGetUrl, options).then((res) => {
            const { data: getURL } = res;
            onChange(getURL);
            setLoading(false);
          });
        })
        .catch(() => {
          setLoading(false);
        });
    });
  };
  return (
    <ReactDropzone onDrop={onDrop} multiple={multiple} {...props}>
      {({ getRootProps, getInputProps }) => (
        <>
          <div {...getRootProps()}>
            <input {...getInputProps()} />
            {children({ url, loading })}
          </div>
          <HelpDialog
            open={sizeHelperOpen}
            onClose={() => setSizeHelperOpen(false)}
          >
            {sizeHelper}
          </HelpDialog>
        </>
      )}
    </ReactDropzone>
  );
};

export default Dropzone;

我正在尝试将onUploadProgress函数的结果输入进度条。我能用定制的钩子吗?我的问题是Dropzone已经有了出口。谢谢你的建议!

EN

Stack Overflow用户

发布于 2022-08-26 21:46:36

您可以在每个axios成功调用之后设置上传优先级值。

代码语言:javascript
复制
axios.get(generatePutUrl, options).then(res => {
          const {
            data: { putURL }
          } = res;
          /* Set precent to 33% here */
          axios
            .put(putURL, file, options)
            .then(() => {
              /* Set precent to 66% */
              axios.get(generateGetUrl, options).then(res => {
                /* Set precent to 99% here */
                const { data: getURL } = res;
                onChange(getURL);
                setLoading(false);
              });
            })
    .catch(() => {
        setLoading(false);
    });
});

希望这能有所帮助。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73475414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档