【发布时间】:2021-11-02 17:20:00
【问题描述】:
当我上传文件时,我正在尝试使用 cloudinary 来托管所有图像数据,但我不断收到 AjaxUploader Uncaught (in promise) TypeError: request is not a function error。我很难弄清楚如何将它与我从官方文档中获得的 ant 设计上传组件一起使用。它应该能够上传最多 5 个文件,如果还有更多,它会有条件地取消渲染上传按钮,我已经完成了。我只是不知道如何处理 customRequest 属性,我所有的工作都在 serverUpload 函数上完成。这是沙盒的链接:https://codesandbox.io/s/happy-sun-n9uus?file=/src/App.js
import React, { useState } from "react";
import Modal from "react-modal";
import { Form, Input, Button, Upload, message } from "antd";
import { UploadOutlined } from "@ant-design/icons";
import axios from "axios";
import cloudinaryInfo from "./cloudinaryInfo/config.js";
const layout = {
labelCol: {
span: 8
},
wrapperCol: {
span: 16
}
};
/* eslint-disable no-template-curly-in-string */
const validateMessages = {
required: "${label} is required!",
types: {
email: "Your email is not a valid email!"
}
};
/* eslint-enable no-template-curly-in-string */
const Question = ({ questionObj, productObj, updatedDataList }) => {
const [isModalOpen, setIsModalOpen] = useState(false);
const [imageFilesList, setImageFilesList] = useState([]);
const toggleModal = (e) => {
e.preventDefault();
e.stopPropagation();
setIsModalOpen(!isModalOpen);
};
const serverUpload = async (options) => {
const { onSuccess, file, onError, onProgress } = options;
console.log("imageFilesList: ", imageFilesList);
try {
const result = await Promise.all([]);
for (let i = 0; i < imageFilesList.length; i++) {
let file = imageFilesList[i];
console.log("FILE: ", file);
const formData = new FormData();
formData.append("file", file);
formData.append(
"upload_preset",
cloudinaryInfo.CLOUDINARY_UPLOAD_PRESET
);
result.push(
axios.post(cloudinaryInfo.CLOUDINARY_IMAGE_UPLOAD_URL, formData)
);
}
onSuccess("ok");
} catch (err) {
console.log(err);
onError(err);
}
};
const uploadProps = {
name: "file",
customRequest: { serverUpload },
onChange(info) {
if (info.file.status !== "uploading") {
console.log("Not uploading ", info.file, info.fileList);
}
if (info.file.status === "done") {
message.success(`${info.file.name} file uploaded successfully`);
} else if (info.file.status === "error") {
message.error(`${info.file.name} file upload failed.`);
}
setImageFilesList(info.fileList);
},
listType: "picture",
maxCount: 5,
multiple: true,
onDrop: true
};
const modalContent = (
<Form
{...layout}
name="nest-messages"
onFinish={(values) => console.log(values)}
validateMessages={validateMessages}
>
<Upload {...uploadProps}>
{imageFilesList.length < 5 && (
<Button icon={<UploadOutlined />}>Upload (Max: 5)</Button>
)}
</Upload>
<Form.Item wrapperCol={{ ...layout.wrapperCol, offset: 8 }}>
<Button type="primary" htmlType="submit">
Submit
</Button>
</Form.Item>
</Form>
);
return (
<div className="question">
<button onClick={(e) => toggleModal(e)}>Open Modal</button>
<hr style={{ height: 0.5, borderColor: "red" }} />
{isModalOpen && (
<div className="openPanel">
<Modal
isOpen={isModalOpen}
onRequestClose={(e) => toggleModal(e)}
ariaHideApp={false}
style={{
overlay: {
backgroundColor: "grey"
}
}}
>
{modalContent}
<Button onClick={(e) => toggleModal(e)}>Close</Button>
</Modal>
</div>
)}
</div>
);
};
export default Question;
【问题讨论】:
-
在
axios.post通话中,您使用的网址是否有效?或'mylink'......错误在你的axios调用的catch块中说明了什么 -
是的,这是一个有效的链接,我只是不想将它分享给公众。我明白了,VM3050:1 POST api.cloudinary.com/v1_1/mycloudname/image/upload 400(错误请求)
-
@RonnyFitzgerald,通常你应该得到更多关于为什么这是一个错误请求的信息。您介意用您的 cloud_name 向 support@cloudinary.com 开票吗,至少我们可以进一步调查?
-
@LoicVdB 我创建了一个 react-app 操场来测试 cloudinary 而没有 ant 设计,只上传单个文件,它可以工作,所以我认为问题不在于 cloudinarys,这就是我结合的方式它与 ant 设计的上传组件会产生问题
标签: javascript reactjs antd cloudinary