-
-
Save jamesrwhite/781ae448ed58e8423e01 to your computer and use it in GitHub Desktop.
Django File upload issues
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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',) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ... | |
# File uploads | |
FILE_UPLOAD_HANDLERS = ( | |
'modules.django_gcs_upload_handler.GoogleCloudStorageUploadHandler', | |
) | |
# ... |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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