MarSeventh / CloudFlare-ImgBed

CloudFlare 图床,基于 CloudFlare Pages 和 Telegram Bot 的免费图片托管解决方案!
https://demo-cloudflare-imgbed.pages.dev/
Creative Commons Zero v1.0 Universal
688 stars 561 forks source link

求助:浏览器使用fetch上传失败,报cors错误 #76

Open foxhank opened 8 hours ago

foxhank commented 8 hours ago

大佬好!我有一个生成图片的网页,想把生成的图片使用fetch上传api上传到图床,随后返回链接。图床和网站使用同一主域名下的不同二级域名。但是我生成 图片后上传时,报CORS错误:

Access to fetch at 'https://pic.foxhank.top/upload' from origin 'https://aidraw.foxhank.top' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

源代码如下:

async function uploadToImageHost(blob) {
                const formData = new FormData();
                formData.append("file", blob, 'generated-image.png'); 

                const myHeaders = new Headers();
                myHeaders.append(      "contentType", 'multipart/form-data',
                    "User-Agent", "Apifox/1.0.0 (https://apifox.com)"); //构建请求头

                const requestOptions = {
                    method: 'POST',
                    headers: myHeaders,
                    body: formData,
                    redirect: 'follow'
                };

                try {
                    const response = await fetch('https://pic.foxhank.top/upload', requestOptions);

                    if (!response.ok) {
                        document.getElementById('aiImage').src = Image;
                        throw new Error(`上传失败:${response.status} ${response.statusText}`);

                    }

                    const result = await response.json();

                    return `https://pic.foxhank.top${result[0].src}`;
                } catch (error) {
                    console.error('Upload Error:', error);
                    throw error;
                }
            }

尝试修改upload.js,但我一改整个上传都会崩掉(悲)求大佬解答!

MarSeventh commented 8 hours ago

二级域名不同也算跨域访问。 可以在upload.js里面的这个地方改下响应头,应该可以允许跨域访问(如果*还是被cors拦截的话,可以改成你需要上传的域名):

res = new Response(
                JSON.stringify([{ 'src': `/file/${fullId}` }]), 
                {
                    status: 200,
                    headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }
                }
            );