【发布时间】:2015-12-13 09:24:35
【问题描述】:
我有一个远程存储项目,当用户请求他的文件时,django 服务器会在本地检索并存储该文件(用于某些处理)作为临时文件,然后使用 mod x-sendfile 将其提供给用户。我当然希望临时文件在提供给用户后被删除。
文档指出 NamedTemporaryFile 删除参数如果设置为 False 会在所有引用消失后导致文件删除。但是当用户收到tempfile 时,它不会被删除。如果我在下载的情况下设置 delete=True,我会得到“在此服务器上找不到请求的 URL /ServeSegment/Test.jpg/。”
这是列出用户文件的视图:
def file_profile(request):
obj = MainFile.objects.filter(owner=request.user)
context = {'title': 'welcome',
'obj': obj
}
return render(request, 'ServeSegments.html', context=context)
这是检索、临时存储和提供请求文件的视图:
def ServeSegment(request, segmentID):
if request.method == 'GET':
url = 'http://192.168.43.7:8000/foo/'+str(segmentID)
r = requests.get(url, stream=True)
if r.status_code == 200:
with tempfile.NamedTemporaryFile(dir=
'/tmp/Files', mode='w+b') as f:
for chunk in r.iter_content(1024):
f.write(chunk)
response = HttpResponse()
response['Content-Disposition'] = 'attachment; segmentID={0}'.format(f.name)
response['X-Sendfile'] = "{0}".format(f.name)
return response
else:
return HttpResponse(str(segmentID))
我想如果我能设法用一个语句返回内部的响应,然后写最后一个块,它会按我的意愿工作,但我没有找到关于如何确定我们是否在最后一个循环中的解决方案(没有hackish)。
我应该如何处理tempfile 并在之后将其删除?
【问题讨论】:
-
除非您可以以浏览器可以解释的某种形式发送文件(例如
base64),否则无法保证在您删除文件之前会提供该文件。请记住,返回响应并不能保证浏览器届时将拥有该文件。 -
不确定你想要什么,但这个包可能对你有用,至少对于测试
django-ajax-upload-widget -
@LorenzoPeña 那么我该如何实现呢?有什么链接可以参考吗?