欢迎光临
我们一直在努力

微信小程序下载中转搭建解决方案详细教程

 问题预览

做微信小程序开发的朋友,大概率遇到过下载的烦心事 —— 明明拿到了地址,调用接口却下载失败。尤其是做去水印、资源分享类小程序时,视频和图片下载的问题更是高频出现。最近不少开发者在社群里咨询相关解决方案,结合实际开发经验,把微信小程序中视频、图片文件的下载思路讲透,避开那些 “坑”。

必备条件

备案的域名及一台服务器(带宽越大越好)

准备所需代码

<?php
// 定义允许的API密钥列表 
$valid_api_keys = [
    'wx-onecat2099', 
];

set_time_limit(0);
ini_set("memory_limit","-1");

// 验证API密钥
$api_key = $_GET['key'] ?? '';  // 从URL参数获取key
if (!in_array($api_key, $valid_api_keys)) {
    header('HTTP/1.0 403 Forbidden');
    die('访问被拒绝:无效的密钥');
}

if (!empty($_GET["url"])) {
    $url = $_GET["url"];

    // 获取文件信息
    $headers = get_headers($url, true);

    // 检查请求是否成功
    if (!$headers || strpos($headers[0], '200') === false) {
        header('HTTP/1.0 404 Not Found');
        die('无法获取文件或文件不存在');
    }

    // 获取内容类型
    $content_type = '';
    if (isset($headers['Content-Type'])) {
        $content_type = is_array($headers['Content-Type']) ? 
                        $headers['Content-Type'][0] : 
                        $headers['Content-Type'];
    }

    // 如果没有获取到内容类型,尝试从URL推断
    if (empty($content_type)) {
        $extension = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_EXTENSION);
        switch (strtolower($extension)) {
            case 'jpg':
            case 'jpeg':
                $content_type = 'image/jpeg';
                break;
            case 'png':
                $content_type = 'image/png';
                break;
            case 'gif':
                $content_type = 'image/gif';
                break;
            case 'webp':
                $content_type = 'image/webp';
                break;
            case 'mp4':
                $content_type = 'video/mp4';
                break;
            case 'pdf':
                $content_type = 'application/pdf';
                break;
            default:
                $content_type = 'application/octet-stream';
        }
    }

    // 设置适当的内容类型头
    header("Content-Type: $content_type");

    // 获取文件大小并设置内容长度头
    if (isset($headers['Content-Length'])) {
        $content_length = is_array($headers['Content-Length']) ? 
                          $headers['Content-Length'][0] : 
                          $headers['Content-Length'];
        header("Content-Length: $content_length");
    }

    // 设置文件名,自动补全后缀
    $filename = basename(parse_url($url, PHP_URL_PATH));
    $extension = pathinfo($filename, PATHINFO_EXTENSION);
    if (empty($extension)) {
        // 根据内容类型补全扩展名
        switch ($content_type) {
            case 'image/jpeg': $filename .= '.jpg'; break;
            case 'image/png': $filename .= '.png'; break;
            case 'image/gif': $filename .= '.gif'; break;
            case 'image/webp': $filename .= '.webp'; break;
            case 'video/mp4': $filename .= '.mp4'; break;
            case 'application/pdf': $filename .= '.pdf'; break;
            default: $filename .= '.bin'; // 未知类型
        }
    }
    header('Content-Disposition: attachment; filename="' . $filename . '"');

    // 输出文件内容
    readfile($url);
} else {
    header('HTTP/1.0 400 Bad Request');
    die('缺少URL参数');
}
?>

搭建教程

1.域名解

首先把自己的域名解析服务器上,利用宝塔建站 创建一个站点 
以cs.baidu.com为例(需要换自己的)

2.上传代码

进入站点根目录 上传代码(代码在文章上方自己复制) 

3.新建一个文本

4.命名为down.php

5.保存文件

把代码粘贴到此区域 保存文件

6.SSL证书

回到网站首页配置SSL证书  点击 未部署 按钮 申请Let’s Encrypt证书。

7.申请证书

申请成功并且保存

到此,中转服务就搭建完成了 中转域名即

https://你的域名/down.php?key=wx-onecat2099&url=

小程序如何使用

中转域名填写到此版本的小程序中转链接区域 然后开启中转下载即可  

需要重新提交代码审核 

配置中转合法域名

需要将自己https://你的域名; (不需要后面那些路由参数 只需要完整域名 )添加到公众平台的request合法域名及uploadFile合法域名里面。

小白专属

可以联系小编直接获取成品中转地址 (付费)

赞(3)
未经允许不得转载:天涯客 » 微信小程序下载中转搭建解决方案详细教程

讨论 1

  1. #1

    短视频去水印中转下载对服务器要求有点高,我2h2g搭建试了下载的时候服务器内存爆红~

    匿名3天前回复