Python后端返回文件或错误,Ajax因Blob类型无法读取错误信息的解决方法
解决方案:文件下载与错误信息读取兼容实现
后端(Python/Django)修改
先处理文件不存在的异常,返回JSON格式的错误响应并设置错误状态码:
import os from django.http import HttpResponse, JsonResponse def your_view(request): file_path = 'test.bin' if not os.path.exists(file_path): return JsonResponse({'error': '文件不存在'}, status=404) with open(file_path, 'rb') as file: file_content = file.read() response = HttpResponse(file_content, content_type='application/octet-stream') response['Content-Disposition'] = f'attachment;filename=test.bin' return response
前端(jQuery Ajax)修改
在error回调中,通过FileReader将Blob类型的响应转换为文本,从而解析错误信息:
$.ajax({ url: 'test', type: 'GET', headers: { 'X-CSRFToken': getCookie('csrftoken') }, xhrFields: { 'responseType': 'blob' }, success: function(data, status, xhr) { var contentDisposition = xhr.getResponseHeader('Content-Disposition'); var matches = /filename=([^;]+)/ig.exec(contentDisposition); var fileName = (matches[1] || 'untitled').trim(); var blob = new Blob([data], {type: xhr.getResponseHeader('Content-Type')}); var link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = fileName; link.click(); // 释放URL对象避免内存泄漏 window.URL.revokeObjectURL(link.href); }, error: function(xhr, status, error) { var reader = new FileReader(); reader.onload = function(e) { try { var errorData = JSON.parse(e.target.result); alert(errorData.error); // 可替换为自定义的错误展示逻辑 } catch (err) { // 非JSON格式错误直接显示文本内容 alert(e.target.result); } }; reader.readAsText(xhr.response); } });
核心逻辑说明
- 后端:提前判断文件存在性,返回带错误状态码的JSON响应,确保前端触发error回调
- 前端:利用
FileReader读取Blob格式的错误响应,转换为文本后解析成JSON,即可获取并展示错误信息
内容的提问来源于stack exchange,提问作者Jurddox
相关产品推荐
相关产品推荐

