Telegraph-Image icon indicating copy to clipboard operation
Telegraph-Image copied to clipboard

大佬,可以上传原图吗?文件没有超过5m

Open hcllmsx opened this issue 11 months ago • 9 comments

本来的图片是226kb,上传之后变成52kb了,压缩的都有点模糊了......

hcllmsx avatar Dec 08 '24 13:12 hcllmsx

应该是上传时TG自动压缩的,操作不了

DJChanahCJD avatar Dec 08 '24 13:12 DJChanahCJD

应该是上传时TG自动压缩的,操作不了

但是直接在TG频道里发图片的时候,不是会让你选择以原图上传或者以压缩方式上传么...

hcllmsx avatar Dec 08 '24 13:12 hcllmsx

应该是上传时TG自动压缩的,操作不了

但是直接在TG频道里发图片的时候,不是会让你选择以原图上传或者以压缩方式上传么...

图片最大可以上传10MB,因为用的sendPhoto接口,会自动压缩。如果统一换成sendDocument接口可以实现原大小上传(免费用户最大支持50MB)

DJChanahCJD avatar Dec 11 '24 14:12 DJChanahCJD

应该是上传时TG自动压缩的,操作不了

但是直接在TG频道里发图片的时候,不是会让你选择以原图上传或者以压缩方式上传么...

你可以直接将upload.js改为只用sendDocument的版本:

import { errorHandling, telemetryData } from "./utils/middleware";

export async function onRequestPost(context) {
    const { request, env } = context;

    try {

        const clonedRequest = request.clone();
        const formData = await clonedRequest.formData();

        await errorHandling(context);
        telemetryData(context);

        const uploadFile = formData.get('file');
        if (!uploadFile) {
            throw new Error('No file uploaded');
        }

        const fileName = uploadFile.name;
        const fileExtension = fileName.split('.').pop().toLowerCase();

        const telegramFormData = new FormData();
        telegramFormData.append("chat_id", env.TG_Chat_ID);

        // 根据文件类型选择合适的上传方式
        let apiEndpoint;
        // if (uploadFile.type.startsWith('image/')) {
        //     telegramFormData.append("photo", uploadFile);
        //     apiEndpoint = 'sendPhoto';
        // } else if (uploadFile.type.startsWith('audio/')) {
        //     telegramFormData.append("audio", uploadFile);
        //     apiEndpoint = 'sendAudio';
        // } else {
            telegramFormData.append("document", uploadFile);
            apiEndpoint = 'sendDocument';
        // }

        const apiUrl = `https://api.telegram.org/bot${env.TG_Bot_Token}/${apiEndpoint}`;
        console.log('Sending request to:', apiUrl);

        const response = await fetch(
            apiUrl,
            {
                method: "POST",
                body: telegramFormData
            }
        );

        console.log('Response status:', response.status);

        const responseData = await response.json();

        if (!response.ok) {
            console.error('Error response from Telegram API:', responseData);
            throw new Error(responseData.description || 'Upload to Telegram failed');
        }

        const fileId = getFileId(responseData);

        if (!fileId) {
            throw new Error('Failed to get file ID');
        }

        // 将文件信息保存到 KV 存储
        if (env.img_url) {
            await env.img_url.put(`${fileId}.${fileExtension}`, "", {
                metadata: {
                    TimeStamp: Date.now(),
                    ListType: "None",
                    Label: "None",
                    liked: false,
                    fileName: fileName,
                    fileSize: uploadFile.size,
                }
            });
        }

        return new Response(
            JSON.stringify([{ 'src': `/file/${fileId}.${fileExtension}` }]),
            {
                status: 200,
                headers: { 'Content-Type': 'application/json' }
            }
        );
    } catch (error) {
        console.error('Upload error:', error);
        return new Response(
            JSON.stringify({ error: error.message }),
            {
                status: 500,
                headers: { 'Content-Type': 'application/json' }
            }
        );
    }
}

function getFileId(response) {
    if (!response.ok || !response.result) return null;

    const result = response.result;
    // if (result.photo) {
    //     return result.photo.reduce((prev, current) =>
    //         (prev.file_size > current.file_size) ? prev : current
    //     ).file_id;
    // }
    if (result.document) return result.document.file_id;
    // if (result.video) return result.video.file_id;
    // if (result.audio) return result.audio.file_id;

    return null;
}

DJChanahCJD avatar Dec 11 '24 14:12 DJChanahCJD

代价是没有自动压缩,要在TG上浏览原图的话需要下载,参考图(其一为sendPhoto,其二为sendDocument): image

DJChanahCJD avatar Dec 11 '24 14:12 DJChanahCJD

代价是没有自动压缩,要在TG上浏览原图的话需要下载,参考图(其一为sendPhoto,其二为sendDocument): image

好的,谢谢大佬。 另外,请问,我是直接复制你上面贴的代码,然后修改我仓库里的upload.js这个文件吗?是可以ctrl+a全选了然后ctrl+v一键替换的那种吗。哈哈哈,我感觉我这问题问得有点过分.....抱歉

hcllmsx avatar Dec 11 '24 15:12 hcllmsx

代价是没有自动压缩,要在TG上浏览原图的话需要下载,参考图(其一为sendPhoto,其二为sendDocument): image

好的,谢谢大佬。 另外,请问,我是直接复制你上面贴的代码,然后修改我仓库里的upload.js这个文件吗?是可以ctrl+a全选了然后ctrl+v一键替换的那种吗。哈哈哈,我感觉我这问题问得有点过分.....抱歉

是的,我这边测试过,应该没问题。

DJChanahCJD avatar Dec 11 '24 15:12 DJChanahCJD

代价是没有自动压缩,要在TG上浏览原图的话需要下载,参考图(其一为sendPhoto,其二为sendDocument): image

好的,谢谢大佬。 另外,请问,我是直接复制你上面贴的代码,然后修改我仓库里的upload.js这个文件吗?是可以ctrl+a全选了然后ctrl+v一键替换的那种吗。哈哈哈,我感觉我这问题问得有点过分.....抱歉

是的,我这边测试过,应该没问题。

那以后这个仓库更新了,我账户的仓库同步了之后,是不是又要这样操作一遍....

hcllmsx avatar Dec 11 '24 16:12 hcllmsx

代价是没有自动压缩,要在TG上浏览原图的话需要下载,参考图(其一为sendPhoto,其二为sendDocument): image

好的,谢谢大佬。 另外,请问,我是直接复制你上面贴的代码,然后修改我仓库里的upload.js这个文件吗?是可以ctrl+a全选了然后ctrl+v一键替换的那种吗。哈哈哈,我感觉我这问题问得有点过分.....抱歉

是的,我这边测试过,应该没问题。

那以后这个仓库更新了,我账户的仓库同步了之后,是不是又要这样操作一遍....

是的,除非仓库也改为只用sendDocument上传

DJChanahCJD avatar Dec 12 '24 01:12 DJChanahCJD