标签:
在本地可以用Django上传文件到Mysql数据库,但在SAE上就行不通了,SAE平台用的是分布式文件系统,官方建议开发者将所有的需要持久化的文件操作都通过Storage实现。Storage是SAE为开发者提供的分布式文件存储服务,用来存放用户的持久化存储的文件
官方说明:用户需要先在Storage的管理界面中创建容器,创建完毕后,用户可以通过以下两种方式操作其中数据:
SAE的storage文档提供了API接口的代码:
http://sae.sina.com.cn/doc/python/storage.html
首先在SAE服务管理开启Storage服务
下面部署代码,编写代码思路,代码分两部分,上传和下载,上传就是将文件upload到Storage中。关于下载,我看遍了Storage接口API就是没有关于下载的API,当时很郁闷,怎么把上传到Storage中的文件再下载下来,之后我进入SAE的Storage的目录中
这是上传到Storage中的文件,然后点文件的名称它会提供一个地址比如:http://pylabsite-pylab.stor.sinaapp.com/Snap.jpg,其实这就是文件的下载地址,然后下载就变得超简单,只用在前端设置一个该地址的超链接就行了,点击之后,就会自动下载。
Django端代码:
models
from django.db import models
class Server(models.Model):
file = models.FileField(upload_to = ‘./‘)
def __unicode__(self):
return self.username
views
#coding:utf-8
from django.shortcuts import render
from django.shortcuts import render_to_response
from django import forms
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from server.models import Server
from django.core.servers.basehttp import FileWrapper
from django.http import StreamingHttpResponse
from django.template import RequestContext
import os
class UploadForm(forms.Form):
file = forms.FileField()
@csrf_exempt
def upload(request):
if request.method == "POST":
form = UploadForm(request.POST,request.FILES)
if form.is_valid():
f = form.cleaned_data[‘file‘]
import sae.const
access_key = sae.const.ACCESS_KEY
secret_key = sae.const.SECRET_KEY
appname = sae.const.APP_NAME
domain_name = "pylab"
import sae.storage
s = sae.storage.Client()
ob = sae.storage.Object(f.read())
url = s.put(domain_name, f.name, ob)
return HttpResponse(‘upload OK‘)
else:
form = UploadForm()
from sae.storage import Bucket
bucket = Bucket(‘pylab‘)
i = bucket.list()
return render_to_response(‘upload.html‘,{‘form‘:form,‘i‘:i},context_instance=RequestContext(request))
前端测试代码:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
</head>
<body>
<h1>Upload</h1>
<form method="post" enctype="multipart/form-data" >
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="ok"/>
</form>
{% for k in i %}
Content:{{k.name}}
<a type="button" href = ‘http://pylabsite-pylab.stor.sinaapp.com/{{k.name}}‘>Download</a>
<br/>
{% endfor %}
</body>
</html>
然后效果就是:
现在简单的网盘就做好了,可以实现文件的上传,上传后的文件点击Download可以下载,Storage免费空间有10G,作为一个网盘来说已经很可观了,但是该Storage单次上传文件不能大于10M。该自制网盘还需要后续优化,比如上传大文件,添加上传进度条,还有CSS方面的美化等等。
标签:
原文地址:http://www.cnblogs.com/pylab/p/4470986.html