【发布时间】:2014-12-28 06:30:23
【问题描述】:
简而言之,我们正在尝试使用 Django 实现以下来自 Google 的示例:
from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
class MainHandler(webapp2.RequestHandler):
def get(self):
upload_url = blobstore.create_upload_url('/upload')
self.response.out.write('<html><body>')
self.response.out.write('<form action="%s" method="POST" enctype="multipart/form-data">' % upload_url)
self.response.out.write("""Upload File: <input type="file" name="file"><br> <input type="submit"
name="submit" value="Submit"> </form></body></html>""")
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
upload_files = self.get_uploads('file') # 'file' is file upload field in the form
blob_info = upload_files[0]
self.redirect('/serve/%s' % blob_info.key())
我们的应用程序是用 Django 1.x 编写的。我们分别使用 urls.py、views.py 和 models.py 来定义我们的 url 方案、视图和数据模型。
在我们的数据库中,我们需要跟踪数据文件(或者至少是对文件在磁盘上的位置的引用)。目前,我们的数据模型如下:
class FileData(models.Model):
token = models.CharField(max_length=10)
file = models.FileField(upload_to=get_upload_file_name, null=True, default=None, blank=True)
“token”字段包含客户端应用程序用于请求下载文件的令牌。字段“文件”旨在包含数据。但是,如果我们需要将其作为对 blob 位置的引用,则不会有问题。我们只是不知道此时该做什么。什么是正确的解决方案?
我们的 urls 模式如下:
urlpatterns = patterns('',
url(r'^upload/', 'views.upload', name='upload'),
url(r'^/serve/([^/]+)?', 'views.servehandler', name='servehandler'),
)
我们的表格如下。
class DataUploadForm(forms.Form):
"""
FileData form
"""
token = forms.CharField(max_length=10)
file = forms.FileField()
class Meta:
model = FileData
fields = ['token', 'file', ]
def __init__(self, *args, **kwargs):
super(DataUploadForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_tag = False
self.helper.layout = Layout(
'token',
'file',
ButtonHolder(
Submit('submit', 'Submit', css_class='btn btn-success btn-block'),
),
)
我们的看法如下。
def upload(request):
args = {}
args.update(csrf(request))
if request.method == 'POST':
print "In /upload"
form = DataUploadForm(request.POST, request.FILES)
if form.is_valid():
file_data = FileData()
file_data.token = request.POST.get('token')
file_data.file = request.FILES.get('file')
print "===========> Uploading:" + file_data.token
file_data.save()
return render(request, 'upload_success.html', args)
form = DataUploadForm()
args['form'] = form
return render(request, 'upload.html', args)
当我们执行时,我们得到:
Exception Value:
[Errno 30] Read-only file system: u
我们做错了什么?我们如何改进我们的代码?我们如何让 Google App Engine 将我们的文件保存在 blobstore 中,并为我们提供文件所在位置的引用以供以后下载使用?
请完整。描述 urls.py、models.Model、views.py 和 yaml 文件所需的更改(如有必要)。解决如何上传大文件(即每个文件大于 40 MB)。
请不要再向我们发送任何链接。我们搜索并看到了很多帖子——没有一个回答这个问题。如果可以的话,请发布一个代码 sn-ps 来回答这个问题——而不是链接。
【问题讨论】:
-
请说明如何上传大文件(即每个文件大于 40 MB)。
标签: django google-app-engine python-2.7