Typeerror تحميل ملف صورة إلى Amazon S3 في Django باستخدام مكتبة Boto

StackOverflow https://stackoverflow.com/questions/3414778

سؤال

أنا مبتدئ تمامًا في البرمجة وجانغو ، لذا أقدر المساعدة التي يمكن للمبتدئين الحصول عليها!

كنت أتابع برنامجًا تعليميًا لإظهار كيفية تحميل الصور إلى حساب Amazon S3 مع مكتبة Boto ، لكنني أعتقد أنه بالنسبة لإصدار أقدم من Django (أنا على 1.1.2 و Python 2.65) وقد تغير شيء ما. أحصل على خطأ: نوع الاستثناء: Typeerror استثناء القيمة: كائن "inmemoryuploadedfile" غير قابل للإكمال

الكود الخاص بي هو:

models.py:

from django.db import models
from django.contrib.auth.models import User
from django import forms
from datetime import datetime

class PhotoUrl(models.Model):
    url = models.CharField(max_length=128)
    uploaded = models.DateTimeField()
    def save(self):
        self.uploaded = datetime.now()
        models.Model.save(self)

views.py:

import mimetypes
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.core.urlresolvers import reverse
from django import forms
from django.conf import settings
from boto.s3.connection import S3Connection
from boto.s3.key import Key

def awsdemo(request):   
def store_in_s3(filename, content):
    conn = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
    b = conn.create_bucket('almacmillan-hark')
    mime = mimetypes.guess_type(filename)[0]
    k = Key(b)
    k.key = filename
    k.set_metadata("Content-Type", mime)
    k.set_contents_from_strong(content)
    k.set_acl("public-read")

photos = PhotoUrl.objects.all().order_by("-uploaded")
if not request.method == "POST":
    f = UploadForm()
    return render_to_response('awsdemo.html', {'form':f, 'photos':photos})

f = UploadForm(request.POST, request.FILES)
if not f.is_valid():
    return render_to_response('awsdemo.html', {'form':f, 'photos':photos})

file = request.FILES['file']
filename = file.name
content = file['content']
store_in_s3(filename, content)
p = PhotoUrl(url="http://almacmillan-hark.s3.amazonaws.com/" + filename)
p.save()
photos = PhotoUrl.objects.all().order_by("-uploaded")   
return render_to_response('awsdemo.html', {'form':f, 'photos':photos})

urls.py:

(r'^awsdemo/$', 'harkproject.s3app.views.awsdemo'), 

Awsdemo.html:

<div class="form">
    <strong>{{form.file.label}}</strong>
    <form method="POST" action ="." enctype="multipart/form-data">
        {{form.file}}<br/>
        <input type="submit" value="Upload">
    </form> 
</div>  

سأقدر حقًا المساعدة. آمل أن أكون قد قدمت رمزًا كافيًا.

نوع التحيات آل

هل كانت مفيدة؟

المحلول

أعتقد أن مشكلتك هي هذا الخط:

content = file['content']

من مستندات Django:

كل قيمة في الملفات عبارة عن كائن uploadedfile يحتوي على السمات التالية:

  • اقرأ (num_bytes = none) - اقرأ عدد من البايتات من الملف.
  • الاسم - اسم الملف الذي تم تحميله.
  • الحجم - الحجم ، بالبايت ، من الملف الذي تم تحميله.
  • القطع (chunk_size = لا شيء) - مولد ينتج عن قطع متسلسلة من البيانات.

جرب هذا بدلاً من ذلك:

content = file.read()

نصائح أخرى

هل جربت Django Storages؟ وبهذه الطريقة ، عليك فقط تحديد الواجهة الخلفية للتخزين (S3Boto في هذه الحالة) إما كواجهة التخزين الافتراضية الخلفية ، أو تزويدها كوسيطة لفئة Filefield أو Imagefield.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top