You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Cpanel托管的Django向DirectAdmin存储共享主机上传前端文件?

FTP方案完全可行,以下是具体实现方法

一、前置准备

  • 确认存储主机(DirectAdmin)的FTP连接信息:主机地址(可填dl.sabaol.ir或主机IP)、FTP端口(默认21,用SFTP则为22)、FTP用户名、密码,以及文件存储的目标目录(需与子域名dl.sabaol.ir的根目录对应,或你指定的可访问目录)。
  • 先用FTP客户端(如FileZilla)测试连接,验证该账号拥有目标目录的写入权限,且上传的文件能通过http://dl.sabaol.ir/文件名正常访问。

二、实现方式

方式1:原生Python ftplib 手动处理上传

适合需要自定义上传逻辑的场景,直接在Django视图中编写FTP上传代码:

import ftplib
from django.http import HttpResponseBadRequest, HttpResponse

def upload_to_storage(request):
    if request.method == 'POST' and 'file' in request.FILES:
        uploaded_file = request.FILES['file']
        
        # FTP连接配置
        ftp_host = 'dl.sabaol.ir'
        ftp_user = '你的FTP用户名'
        ftp_pass = '你的FTP密码'
        target_dir = '/public_html'  # 对应dl.sabaol.ir的根目录,根据实际调整
        
        try:
            # 建立FTP连接(被动模式,共享主机大多需要)
            ftp = ftplib.FTP(ftp_host)
            ftp.login(ftp_user, ftp_pass)
            ftp.set_pasv(True)
            
            # 切换到目标目录
            ftp.cwd(target_dir)
            
            # 上传二进制文件
            ftp.storbinary(f'STOR {uploaded_file.name}', uploaded_file)
            
            ftp.quit()
            return HttpResponse(f"文件上传成功:http://dl.sabaol.ir/{uploaded_file.name}")
        except ftplib.all_errors as e:
            return HttpResponseBadRequest(f"FTP上传失败:{str(e)}")
    return HttpResponseBadRequest("请求无效")

方式2:使用django-storages 集成FTP存储后端

更符合Django存储API规范,无需手动编写FTP逻辑,让FileField自动上传到存储主机:

  1. 安装依赖:
pip install django-storages
  1. 在settings.py中添加配置:
INSTALLED_APPS = [
    # ... 其他已安装APP
    'storages',
]

# FTP存储核心配置
DEFAULT_FILE_STORAGE = 'storages.backends.ftp.FTPStorage'
FTP_HOST = 'dl.sabaol.ir'
FTP_USER = '你的FTP用户名'
FTP_PASSWORD = '你的FTP密码'
FTP_ROOT = '/public_html'  # 对应dl.sabaol.ir的根目录
FTP_URL = 'http://dl.sabaol.ir/'  # 文件访问的基础URL
  1. 在模型中使用FileField:
from django.db import models

class UserUpload(models.Model):
    file = models.FileField(upload_to='user_files/')  # 文件自动上传到FTP主机的/public_html/user_files/目录
    upload_time = models.DateTimeField(auto_now_add=True)

此时,user_upload.file.url会自动生成http://dl.sabaol.ir/user_files/文件名的访问地址。

三、注意事项

  • 被动模式:共享主机的FTP服务通常要求启用被动模式(set_pasv(True)),否则可能出现连接超时或权限错误。
  • 安全性:FTP为明文传输,若上传敏感文件,建议改用SFTP(可使用paramiko库或django-storages的SFTPStorage后端,配置逻辑一致,端口改为22)。
  • 文件名冲突:建议对上传文件重命名(如添加时间戳或随机字符串),避免同名文件覆盖。
  • 权限验证:定期检查FTP账号的目录权限,确保写入操作正常。

内容的提问来源于stack exchange,提问作者Reza245

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:33:22