2012-01-11 27 views
6

đăng từ một ứng dụng (iOS android v.v ..) không phải là biểu mẫu web.Làm thế nào để lưu hình ảnh bằng cách sử dụng django imageField?

class someImage(models.Model): 
    image = models.ImageField(upload_to= settings.SHARE_IMAGE_UPLOAD_PATH) 

@csrf_exempt 
def saveImage(request): 

Cách viết chế độ xem? nó nhận được một hình ảnh trong một yêu cầu đăng bài. Mỗi điều tôi thấy là hình thức liên quan (server newbie)

+0

hãy nhìn vào [django-photologue] (http://code.google.com/p/django-photologue/), tất cả những gì bạn muốn làm đã được thực hiện :) – juliomalegria

+0

cảm ơn, tôi không cần tất cả các tính năng này, tôi đang tìm kiếm cơ bản nhất sử dụng imageField :) –

Trả lời

15

Chỉ vì bạn không sử dụng một hình thức HTML thực tế để gửi dữ liệu không có nghĩa là bạn không thể sử dụng một ModelForm để xử lý yêu cầu:

from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed 
from django.utils import simplejson 

def upload_view(request): 
    if request.method == 'POST': 
     form = UploadForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      result = {'success': True} 
      return HttpResponse(simplejson.dumps(result), mimetype='application/json') 
     else: 
      return HttpResponseBadRequest() 
    else: 
     return HttpResponseNotAllowed(['POST']) 
+0

tôi nhận được kết quả thành công, nhưng tôi không thấy tệp đang được lưu trên đường dẫn tôi đặt ở phương thức (đó là đường dẫn cục bộ: Người dùng/yogevshelly/Downloads /) khi tôi thử lưu hình ảnh vào đĩa bằng Image.save ('path', 'JPEG') tôi thấy tệp, nhưng tôi phải thêm '/' vào đường dẫn bắt đầu. bất kỳ ý tưởng? thanks –

+0

Rất tiếc, các hình ảnh đã được lưu lại tốt, chỉ liên quan đến thư mục dự án chứ không phải thư mục gốc của máy tính của tôi, cảm ơn rất nhiều! –

+0

Và đừng quên bao gồm 'enctype =" multipart/form-data "' trong mẫu biểu mẫu như đã nêu tại http://stackoverflow.com/a/5567063/955619 – Caumons

3

Edit: Vui lòng sử dụng các câu trả lời được lựa chọn ở trên - mã dưới đây làm việc cho các câu hỏi nhưng nó không được khuyến khích.

Các tập tin hình ảnh mà bạn đang tải lên có thể được tìm thấy trong:

request.FILES['image'] # assuming input name is called 'image' 

Nó không trả lại cho bạn một đối tượng hình ảnh, mà đúng hơn là một đối tượng uploadedfile. Bạn có thể đọc phần tài liệu này (Tôi giả sử bạn đang sử dụng Django 1.3.x): https://docs.djangoproject.com/en/1.3/topics/http/file-uploads/#handling-uploaded-files

Nó bao gồm các trường và phương thức có sẵn trong đối tượng UploadedFile và cũng là cách phổ biến để xử lý tệp tải lên theo cách thủ công. Bạn có thể sử dụng cùng một phương thức để ghi tệp hình ảnh vào một đối tượng tệp và sau đó lưu nó vào ImageField của bạn.

Mã sau đây sẽ hoạt động nhưng không phải là mã an toàn. Tôi giả sử bạn đang sử dụng máy * nix, nếu không, hãy lưu tệp đích ở một nơi khác.

@csrf_exempt 
def saveImage(request): 
    # warning, code might not be safe 
    up_file = request.FILES['image'] 
    destination = open('/tmp/' + up_file.name , 'wb+') 
    for chunk in up_file.chunks(): 
     destination.write(chunk) 
    destination.close() 
    img = someImage() 
    img.image.save(up_file.name, File(open('/tmp/' + up_file.name, 'r'))) 
    img.save() 
    # return any response you want after this 

Những điều khác cần lưu ý: Hãy chắc chắn rằng bạn tạo có các thuộc tính sau cho nó hoạt động:

<form enctype="multipart/form-data" ... > 

tôi không nhớ sử dụng này là bình thường, nhưng thực sự, biểu mẫu được khuyến khích.

+0

cảm ơn, tôi biết điều đó. giờ thì sao? dòng chảy là gì? thế nào để tôi lưu nó vào tập tin vật lý và chỉ cần vượt qua đường dẫn đến imageField? bất kỳ đoạn trích nào, nó phải là một nhiệm vụ rất phổ biến, cảm ơn! –

+0

Tôi đã cập nhật câu trả lời với mã mẫu. Mã sẽ đơn giản hơn và an toàn hơn nhiều nếu bạn sử dụng Mẫu biểu mẫu. –

Các vấn đề liên quan