Skip to content

Instantly share code, notes, and snippets.

@jamesrwhite
Created October 23, 2013 17:26
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jamesrwhite/781ae448ed58e8423e01 to your computer and use it in GitHub Desktop.
Save jamesrwhite/781ae448ed58e8423e01 to your computer and use it in GitHub Desktop.
Django File upload issues
from django.core.files.uploadhandler import FileUploadHandler
from django.core.files.uploadedfile import UploadedFile
from .. import cloudstorage as gcs
class GoogleCloudStorageUploadHandler(FileUploadHandler):
def __init__(self, request=None):
self.file_name = None
self.content_type = None
self.content_length = None
self.charset = None
self.request = request
self.file_size = None
self.bucket = '/path-to-my-bucket'
self.gcs_file = None
def receive_data_chunk(self, raw_data, start):
self.gcs_file.write(raw_data)
return None
def file_complete(self, file_size):
self.file_size = file_size
self.gcs_file.close()
return UploadedFile(
file = self.gcs_file,
name = self.file_name,
content_type = self.content_type,
size = self.file_size,
charset = self.charset
)
def new_file(self, field_name, file_name, content_type, content_length, charset=None):
self.field_name = field_name
self.file_name = file_name
self.content_type = content_type
self.content_length = content_length
self.charset = charset
self.gcs_file = gcs.open(self.bucket + '/' + file_name, 'w', content_type=content_type)
from django.db import models
from django import forms
MEDIA_TYPES = (
('audio', 'audio'),
('video', 'video'),
('text', 'text'),
('image', 'image'),
)
# Used for uploading media that forms part of a story
class Media(models.Model):
title = models.CharField(max_length=100)
type = models.CharField(max_length=5, choices=MEDIA_TYPES)
content = models.TextField()
date_created = models.DateTimeField(auto_now_add=True)
file = models.FileField()
# Used to convert the media model to a form in the cms
class MediaForm(forms.ModelForm):
class Meta:
model = Media
# Don't show the date created field because we want that to be set automatically
exclude = ('date_created', 'content',)
# ...
# File uploads
FILE_UPLOAD_HANDLERS = (
'modules.django_gcs_upload_handler.GoogleCloudStorageUploadHandler',
)
# ...
from django.http import HttpResponse
from django.shortcuts import redirect, render
from django.contrib.auth.decorators import login_required
from django.contrib.auth import logout as logout_user
from django.contrib import messages
from django.core.urlresolvers import reverse
from api.models import Media
from api.models import MediaForm
from modules import cloudstorage as gcs
# ....
# Render the add/edit media form or handle saving it
@login_required
def media_add_or_edit(request, id=False):
# Is it a POST request, i.e is the form being submitted
if request.method == 'POST':
# Pass the form all the HTTP POST data
form = MediaForm(request.POST, request.FILES)
# Run through any validation rules we have
if form.is_valid():
# Save the form data to the db
form.save()
# Show a success message to the user
message_suffix = 'added!' if id is False else 'edited'
messages.success(request, 'Media succesfully %s' % message_suffix)
# Redirect them back to the media home page
return redirect('media-home')
# Were we passed the id? i.e are we editing an object, if so get it to pass to the template
if id is not False:
media = Media.objects.get(id=id)
form = form if request.method == 'POST' else MediaForm(instance=media)
template_data = {'form': form, 'title': media.title}
# If not we must be adding new media as we have no id in the URL
else:
form = form if request.method == 'POST' else MediaForm()
template_data = {'form': form, 'title': 'Add Media'}
return render(request, 'cms/form.html', template_data)
# ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment