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

Android应用上传文件至Django API请求超时,1像素图片亦触发

问题描述

我正在开发一款Android Studio应用,在通过Django API将图片从应用上传至服务器时遇到问题。所有请求均处于“pending”状态,2分钟后返回500超时错误。

测试情况:

  • 分别通过Postman、Android应用、接口同目录下的JS文件发起请求,结果一致
  • 排除文件大小问题(已测试1×1像素图片)
  • 排除服务器资源不足问题(请求pending时RAM、CPU占用无变化)
  • 客户端和服务器日志均无错误信息

接口代码如下:

@api_view(['POST'])
def changeProfile(request):
    user_id = int(request.data.get('userId', ''))

    pfp_file = request.FILES.get('pfp', None)
    pfb_file = request.FILES.get('pfb', None)
    
    data = {'rescode': '0001', 'message': 'Profile updated'}

    # Set CORS headers
    response = Response(data)
    response = Response(data)
    response['Access-Control-Allow-Origin'] = '*'
    response['Access-Control-Allow-Credentials'] = 'true'
    response['Access-Control-Allow-Headers'] = 'content-type'
    response['Access-Control-Allow-Methods'] = 'POST, OPTIONS'
    
    return response
排查与解决建议
  • 清理冗余响应代码:代码中连续两次执行response = Response(data),属于无效冗余操作,建议删除其中一行,避免响应构建过程中出现未知异常。
  • 规范CORS处理逻辑:手动设置CORS头容易遗漏OPTIONS预检请求的响应逻辑,直接使用django-cors-headers库替代手动配置更可靠:
    1. 安装库:
      pip install django-cors-headers
      
    2. 在settings.py中添加配置:
      INSTALLED_APPS = [
          ...
          'corsheaders',
          ...
      ]
      
      MIDDLEWARE = [
          ...
          'corsheaders.middleware.CorsMiddleware',
          'django.middleware.common.CommonMiddleware',
          ...
      ]
      
      CORS_ALLOW_ALL_ORIGINS = True
      CORS_ALLOW_CREDENTIALS = True
      CORS_ALLOW_METHODS = ['POST', 'OPTIONS']
      CORS_ALLOW_HEADERS = ['content-type']
      
  • 检查文件上传核心配置:
    • 确认settings.py中MEDIA_ROOT指定的目录存在且服务器进程有读写权限
    • 核对FILE_UPLOAD_MAX_MEMORY_SIZE等参数,即使小文件也可能因配置异常导致上传阻塞
  • 添加异常捕获与日志:在接口中加入异常捕获,强制记录潜在错误,比如userId为空时的转换异常:
    import logging
    
    logger = logging.getLogger(__name__)
    
    @api_view(['POST'])
    def changeProfile(request):
        try:
            user_id = int(request.data.get('userId', 0))  # 给默认值避免空值转换报错
            pfp_file = request.FILES.get('pfp', None)
            pfb_file = request.FILES.get('pfb', None)
            
            # 测试文件读写:如果文件存在则临时保存
            if pfp_file:
                with open(f'/tmp/test_pfp.jpg', 'wb+') as f:
                    for chunk in pfp_file.chunks():
                        f.write(chunk)
            
            data = {'rescode': '0001', 'message': 'Profile updated'}
            return Response(data)
        except Exception as e:
            logger.error(f"changeProfile接口错误: {str(e)}")
            return Response({'rescode': '0002', 'message': str(e)}, status=500)
    
  • 排查服务器网络与代理配置:
    • 确认服务器端口对外开放,防火墙未拦截请求
    • 若使用Nginx等反向代理,检查proxy_read_timeout是否设置过短,client_max_body_size是否允许文件上传
  • 拆分测试逻辑:先编写一个不带文件上传的简单POST接口,验证基础连通性,确认无问题后再逐步添加文件上传逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:45:17