উত্তর:
ভাই, জ্যাঙ্গো ডকুমেন্টেশনের এই সম্পর্কে ভাল উদাহরণ নেই। এটি কীভাবে কাজ করে তা বুঝতে আমি টুকরো টুকরো করার জন্য 2 ঘন্টা ব্যয় করেছি। সেই জ্ঞানের সাহায্যে আমি একটি প্রকল্প বাস্তবায়ন করেছি যা ফাইলগুলি আপলোড এবং তালিকা হিসাবে তাদের দেখানো সম্ভব করে। প্রকল্পের উত্স ডাউনলোড করতে, https://github.com/axelpale/minimal-django-file-upload-example দেখুন বা এটি ক্লোন করুন:
> git clone https://github.com/axelpale/minimal-django-file-upload-example.git
আপডেট 2013-01-30: গিটহাবের উত্সটি 1.3 ছাড়াও জাজানো 1.4 এর জন্য বাস্তবায়ন করেছে। কিছু পরিবর্তন থাকলেও নিম্নলিখিত টিউটোরিয়ালটি 1.4 এর জন্যও কার্যকর।
আপডেট 2013-05-10: গিটহাবে জাজানো 1.5 এর জন্য বাস্তবায়ন। Urls.py এ পুনঃনির্দেশে ছোটখাট পরিবর্তন এবং list.html এ url টেমপ্লেট ট্যাগ ব্যবহার। চেষ্টার জন্য হুবার্ট 3 ধন্যবাদ ।
আপডেট 2013-12-07: জিতগো 1.6 গিটহাবে সমর্থিত। একটি আমদানি myapp / urls.py এ পরিবর্তিত হয়েছে। ধন্যবাদ অর্থেডিয়ানকে ।
2015-03-17 আপডেট করুন: জোনগো 1.7 টি গিতহাবের সমর্থিত, অরণিসিডোরোকে ধন্যবাদ ।
2015-09-04 আপডেট করুন: জ্যাঙ্গো 1.8 গিটহাবে সমর্থিত, নারোগিতকে ধন্যবাদ ।
আপডেট 2016-07-03: জ্যাঙ্গো 1.9 গিটহাবে সমর্থিত, দাভভে এবং নারোগিটকে ধন্যবাদ
একক অ্যাপ্লিকেশন এবং মিডিয়া / আপলোডগুলির জন্য ডিরেক্টরি সহ একটি বেসিক জ্যাঙ্গো 1.3 প্রকল্প।
minimal-django-file-upload-example/
src/
myproject/
database/
sqlite.db
media/
myapp/
templates/
myapp/
list.html
forms.py
models.py
urls.py
views.py
__init__.py
manage.py
settings.py
urls.py
ফাইলগুলি আপলোড এবং পরিবেশন করতে আপনাকে জ্যাঙ্গো কোথায় আপলোড করা ফাইল সংরক্ষণ করে এবং কোন ইউআরএল থেকে জ্যাঙ্গো তাদের পরিবেশন করতে হবে তা উল্লেখ করতে হবে। MEDIA_ROOT এবং MEDIA_URL ডিফল্টরূপে সেটিংসে রয়েছে py কিন্তু সেগুলি খালি। বিশদ বিবরণের জন্য জাজানো ম্যানেজিং ফাইলের প্রথম লাইনগুলি দেখুন। মনে রাখবেন ডাটাবেসটি সেট করুন এবং মাইপ অ্যাপ্লিকেশনটি INSTALLED_APPS এ যুক্ত করুন
...
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'database.sqlite3'),
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
...
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
...
INSTALLED_APPS = (
...
'myapp',
)
এর পরে আপনার ফাইলফিল্ড সহ একটি মডেল দরকার। এই নির্দিষ্ট ক্ষেত্রটি মিডিয়া / ডকুমেন্টগুলিতে / 2011/12/24 / বর্তমান তারিখ এবং মিডিয়া_রোটের ভিত্তিতে ফাইল সঞ্চয় করে। ফাইলফিল্ড উল্লেখ দেখুন ।
# -*- coding: utf-8 -*-
from django.db import models
class Document(models.Model):
docfile = models.FileField(upload_to='documents/%Y/%m/%d')
সুন্দরভাবে আপলোড হ্যান্ডেল করতে আপনার একটি ফর্ম দরকার। এই ফর্মটিতে কেবল একটি ক্ষেত্র রয়েছে তবে এটি যথেষ্ট। বিস্তারিত জানার জন্য ফর্ম ফাইলফিল্ড দেখুন reference
# -*- coding: utf-8 -*-
from django import forms
class DocumentForm(forms.Form):
docfile = forms.FileField(
label='Select a file',
help_text='max. 42 megabytes'
)
এমন দৃশ্য যেখানে সমস্ত যাদু ঘটে। কীভাবে request.FILES
পরিচালনা করা হয় তা মনোযোগ দিন । আমার জন্য, request.FILES['docfile']
মডেলগুলিতে সংরক্ষণ করা যায় এমন সত্যটি চিহ্নিত করা সত্যিই শক্ত ছিল ile ঠিক একই মতো ফাইলফিল্ড। মডেলের সংরক্ষণ () ফাইলটি স্বয়ংক্রিয়ভাবে ফাইল সিস্টেমে স্টোরিং পরিচালনা করে।
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from myproject.myapp.models import Document
from myproject.myapp.forms import DocumentForm
def list(request):
# Handle file upload
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
newdoc = Document(docfile = request.FILES['docfile'])
newdoc.save()
# Redirect to the document list after POST
return HttpResponseRedirect(reverse('myapp.views.list'))
else:
form = DocumentForm() # A empty, unbound form
# Load documents for the list page
documents = Document.objects.all()
# Render list page with the documents and the form
return render_to_response(
'myapp/list.html',
{'documents': documents, 'form': form},
context_instance=RequestContext(request)
)
জ্যাঙ্গো ডিফল্টভাবে MEDIA_ROOT পরিবেশন করে না। এটি উত্পাদন পরিবেশে বিপজ্জনক হবে। তবে উন্নয়নের পর্যায়ে আমরা সংক্ষিপ্তভাবে কাটতে পারি। শেষ লাইনে মনোযোগ দিন। এই লাইনটি জ্যাঙ্গোকে এমইডিআইএ_আরএল থেকে ফাইলগুলি সরবরাহ করতে সক্ষম করে। এটি কেবল বিকাশ পর্যায়ে কাজ করে।
বিস্তারিত জানার জন্য django.conf.urls.static.static রেফারেন্স দেখুন । মিডিয়া ফাইল পরিবেশন করা সম্পর্কে এই আলোচনা দেখুন ।
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = patterns('',
(r'^', include('myapp.urls')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
দর্শনটি অ্যাক্সেসযোগ্য করার জন্য আপনাকে অবশ্যই এর জন্য ইউআরএল নির্দিষ্ট করতে হবে। এখানে বিশেষ কিছু নেই।
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
urlpatterns = patterns('myapp.views',
url(r'^list/$', 'list', name='list'),
)
শেষ অংশ: তালিকার জন্য টেমপ্লেট এবং এর নীচে আপলোড ফর্ম। ফর্মটিতে এনজাইটাইপ-এ্যাট্রিবিউট সেট করতে হবে "মাল্টিপার্ট / ফর্ম-ডেটা" এবং পদ্ধতিতে "পোস্ট" সেট করা জাজানোতে আপলোড করা সম্ভব। বিশদে ফাইল আপলোডের ডকুমেন্টেশন দেখুন ।
ফাইলফিল্ডের অনেকগুলি বৈশিষ্ট্য রয়েছে যা টেমপ্লেটগুলিতে ব্যবহার করা যেতে পারে। যেমন {{document.docfile.url}} এবং {{document.docfile.name} the টেমপ্লেটের মতো। মডেল নিবন্ধ এবং ফাইল অবজেক্ট ডকুমেন্টেশনে ফাইলগুলি ব্যবহার করার বিষয়ে এগুলি সম্পর্কে আরও দেখুন ।
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Minimal Django File Upload Example</title>
</head>
<body>
<!-- List of uploaded documents -->
{% if documents %}
<ul>
{% for document in documents %}
<li><a href="{{ document.docfile.url }}">{{ document.docfile.name }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No documents.</p>
{% endif %}
<!-- Upload form. Note enctype attribute! -->
<form action="{% url 'list' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>{{ form.non_field_errors }}</p>
<p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p>
<p>
{{ form.docfile.errors }}
{{ form.docfile }}
</p>
<p><input type="submit" value="Upload" /></p>
</form>
</body>
</html>
কেবল সিঙ্কডিবি এবং রানসরভার চালান।
> cd myproject
> python manage.py syncdb
> python manage.py runserver
অবশেষে, সবকিছু প্রস্তুত। ডিফল্ট জ্যাঙ্গো বিকাশ পরিবেশে আপলোড করা দস্তাবেজের তালিকাতে দেখা যায় localhost:8000/list/
। আজ ফাইলগুলি / পাথ / টু / মাইপ্রজেক্ট / মিডিয়া / নথি / 2011/12/17 / এ আপলোড করা হয়েছে এবং তালিকা থেকে খোলা যেতে পারে।
আমি আশা করি এই উত্তরটি কাউকে ততটাই সহায়তা করবে যতটা এটি আমাকে সহায়তা করেছিল।
{% url list %}
হয়ে যায় {% url "list" %}
।
সাধারণত যখন আপনি 'কেবল একটি কাজের উদাহরণ পেতে' চেষ্টা করছেন তখন 'কেবল কোড লেখা শুরু করা' ভাল। আপনাকে সহায়তা করার জন্য এখানে কোনও কোড নেই, সুতরাং এটি প্রশ্নের উত্তর দেওয়া আমাদের জন্য আরও অনেক বেশি কাজ করে।
আপনি যদি কোনও ফাইল ধরতে চান তবে এইচটিএমএল ফাইলে আপনার কোথাও এরকম কিছু দরকার:
<form method="post" enctype="multipart/form-data">
<input type="file" name="myfile" />
<input type="submit" name="submit" value="Upload" />
</form>
এটি আপনাকে ব্রাউজ বোতামটি দেবে, ক্রিয়াটি শুরু করার জন্য একটি আপলোড বোতাম (ফর্মটি জমা দিন) এবং এনকটাইপটি নোট করবে যাতে জ্যাঙ্গো আপনাকে দিতে জানে request.FILES
একটি দৃশ্যে কোথাও আপনি ফাইলটি অ্যাক্সেস করতে পারেন
def myview(request):
request.FILES['myfile'] # this is my file
ফাইল আপলোড ডক্সে প্রচুর পরিমাণে তথ্য রয়েছে
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি পৃষ্ঠাটি পুরোপুরি পড়ুন এবং কেবল কোড লেখা শুরু করুন - তারপরে উদাহরণ সহ ফিরে আসুন এবং যখন এটি কার্যকর না হয় তখন ট্রেস স্ট্যাক করুন।
enctype="multipart/form-data"
কি আমি এই কাজ করতে প্রয়োজন ধন্যবাদ!
গিথুব রেপো দেখুন, জাঙ্গো 3 এর সাথে কাজ করে
স্টার্টপ্রজেক্ট চালান ::
$ django-admin.py startproject sample
এখন একটি ফোল্ডার ( নমুনা ) তৈরি করা হয়েছে।
একটি অ্যাপ্লিকেশন তৈরি করুন ::
$ cd sample
$ python manage.py startapp uploader
এখন uploader
এই ফাইলগুলির সাথে একটি ফোল্ডার তৈরি করা হয়েছে ::
uploader/
__init__.py
admin.py
app.py
models.py
tests.py
views.py
migrations/
__init__.py
উপর sample/settings.py
অ্যাড 'uploader'
করতে INSTALLED_APPS
যোগ MEDIA_ROOT
এবং MEDIA_URL
, অর্থাত্ ::
INSTALLED_APPS = [
'uploader',
...<other apps>...
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
মধ্যে sample/urls.py
অ্যাড ::
...<other imports>...
from django.conf import settings
from django.conf.urls.static import static
from uploader import views as uploader_views
urlpatterns = [
...<other url patterns>...
path('', uploader_views.UploadView.as_view(), name='fileupload'),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
আপডেট uploader/models.py
::
from django.db import models
class Upload(models.Model):
upload_file = models.FileField()
upload_date = models.DateTimeField(auto_now_add =True)
আপডেট uploader/views.py
::
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .models import Upload
class UploadView(CreateView):
model = Upload
fields = ['upload_file', ]
success_url = reverse_lazy('fileupload')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['documents'] = Upload.objects.all()
return context
একটি ফোল্ডার নমুনা / আপলোডার / টেম্পলেট / আপলোডার তৈরি করুন
একটি ফাইল তৈরি করুন upload_form.html অর্থাত sample/uploader/templates/uploader/upload_form.html
::
<div style="padding:40px;margin:40px;border:1px solid #ccc">
<h1>Django File Upload</h1>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form><hr>
<ul>
{% for document in documents %}
<li>
<a href="{{ document.upload_file.url }}">{{ document.upload_file.name }}</a>
<small>({{ document.upload_file.size|filesizeformat }}) - {{document.upload_date}}</small>
</li>
{% endfor %}
</ul>
</div>
ডাটাবেস এবং রানসরভার সিঙ্ক্রোনাইজ করুন ::
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py runserver
পরিদর্শন HTTP: // স্থানীয় হোস্ট: 8000 /
FileField
কিছুক্ষণ সুহেল ব্যবহার করেছেন ImageField
, কেউ দয়া করে পছন্দগুলি ব্যাখ্যা করতে পারেন?
FileField
। ImageField
শুধুমাত্র চিত্র আপলোড করার জন্য। আপডেটটি জাঙ্গো 1.11 এর সাথে কাজ করবে।
আমি অবশ্যই বলব যে আমি জঞ্জো বিভ্রান্তিতে ডকুমেন্টেশনটি পেয়েছি। এছাড়াও সহজ উদাহরণের জন্য কেন ফর্মগুলি উল্লেখ করা হচ্ছে? ভিউ.পি-তে কাজ করার উদাহরণটি হ'ল: -
for key, file in request.FILES.items():
path = file.name
dest = open(path, 'w')
if file.multiple_chunks:
for c in file.chunks():
dest.write(c)
else:
dest.write(file.read())
dest.close()
এইচটিএমএল ফাইলটি নীচের কোডের মতো দেখায়, যদিও এই উদাহরণটি কেবল একটি ফাইল আপলোড করে এবং ফাইলগুলি সংরক্ষণ করার কোডটি অনেকগুলি হ্যান্ডেল করে: -
<form action="/upload_file/" method="post" enctype="multipart/form-data">{% csrf_token %}
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
এই উদাহরণগুলি আমার কোড নয়, সেগুলি আমি খুঁজে পাওয়া অন্য দুটি উদাহরণ থেকে খুঁজে পেয়েছি। আমি জ্যাঙ্গোর একটি আপেক্ষিক প্রাথমিক তাই খুব সম্ভবত আমি কিছু মূল বিষয় অনুপস্থিত।
FileField
এবং a ব্যবহার না করার জন্য +1 model.Form
। নতুনদের জন্য (এবং তুচ্ছ কাজগুলির জন্য), উপরে দেখানো মত আপলোড করা ফাইলগুলির ম্যানুয়াল প্রসেসিং কম বিভ্রান্তিকর।
আমারও অনুরূপ প্রয়োজন ছিল। নেটে বেশিরভাগ উদাহরণগুলি মডেল তৈরি করতে এবং ফর্মগুলি তৈরি করতে বলছে যা আমি ব্যবহার করতে চাই না। এখানে আমার চূড়ান্ত কোড।
if request.method == 'POST':
file1 = request.FILES['file']
contentOfFile = file1.read()
if file1:
return render(request, 'blogapp/Statistics.html', {'file': file1, 'contentOfFile': contentOfFile})
এবং এইচটিএমএল আপলোড করতে আমি লিখেছি:
{% block content %}
<h1>File content</h1>
<form action="{% url 'blogapp:uploadComplete'%}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input id="uploadbutton" type="file" value="Browse" name="file" accept="text/csv" />
<input type="submit" value="Upload" />
</form>
{% endblock %}
নিম্নলিখিতটি এইচটিএমএল রয়েছে যা ফাইলের সামগ্রী প্রদর্শন করে:
{% block content %}
<h3>File uploaded successfully</h3>
{{file.name}}
</br>content = {{contentOfFile}}
{% endblock %}
হেনরির উদাহরণটিতে প্রসারিত :
import tempfile
import shutil
FILE_UPLOAD_DIR = '/home/imran/uploads'
def handle_uploaded_file(source):
fd, filepath = tempfile.mkstemp(prefix=source.name, dir=FILE_UPLOAD_DIR)
with open(filepath, 'wb') as dest:
shutil.copyfileobj(source, dest)
return filepath
আপনি handle_uploaded_file
আপলোডকৃত ফাইল অবজেক্টের সাথে আপনার ভিউ থেকে এই ফাংশনটি কল করতে পারেন । এটি ফাইল সিস্টেমে একটি অনন্য নাম (মূল আপলোড হওয়া ফাইলের ফাইল নাম সহ পূর্ববর্তী) সহ ফাইলটি সংরক্ষণ করবে এবং সংরক্ষণিত ফাইলের পুরো পথটি ফিরিয়ে দেবে। আপনি ডাটাবেসে পাথটি সংরক্ষণ করতে পারেন এবং পরে ফাইলটি দিয়ে কিছু করতে পারেন।
request.FILES['myfile']
) এ পাস করুন handle_uploaded_file
, request
নিজেই নয়।
prefix=source.name
এটি ব্যবহার করে ফাইলের শেষে অতিরিক্ত অক্ষর যুক্ত হয়েছে, ফাইল এক্সটেনশনের সাথে বিশৃঙ্খলা। যেমন upload.csv
পরিবর্তিত হয়েছে upload.csv5334
। suffix=source.name
আমার জন্য এটি স্থির করার জন্য এটি পরিবর্তন করা ।
এখানে এটি আপনাকে সহায়তা করতে পারে: আপনার মডেলগুলিতে একটি ফাইল ক্ষেত্র তৈরি করুন pypy
ফাইল আপলোড করার জন্য (আপনার অ্যাডমিন.পিতে):
def save_model(self, request, obj, form, change):
url = "http://img.youtube.com/vi/%s/hqdefault.jpg" %(obj.video)
url = str(url)
if url:
temp_img = NamedTemporaryFile(delete=True)
temp_img.write(urllib2.urlopen(url).read())
temp_img.flush()
filename_img = urlparse(url).path.split('/')[-1]
obj.image.save(filename_img,File(temp_img)
এবং আপনার টেমপ্লেটে সেই ক্ষেত্রটিও ব্যবহার করুন।
আপনি ফাইন আপলোডারে সার্ভারের উদাহরণগুলি উল্লেখ করতে পারেন, যার জ্যাঙ্গো সংস্করণ রয়েছে। https://github.com/FineUploader/server-examples/tree/master/python/django-fine-uploader
এটি অত্যন্ত মার্জিত এবং সর্বোপরি গুরুত্বপূর্ণ এটি বৈশিষ্ট্যযুক্ত জেএস লাইব সরবরাহ করে। টেমপ্লেট সার্ভার-উদাহরণগুলিতে অন্তর্ভুক্ত নেই তবে আপনি তার ওয়েবসাইটে ডেমো খুঁজে পেতে পারেন। ফাইন আপলোডার: http://fineuploader.com/demos.html
views.py
আপলোডউউ পোস্টটি প্রেরণ করে এবং সংশ্লিষ্ট হ্যান্ডলারের কাছে অনুরোধ মুছে দিন।
class UploadView(View):
@csrf_exempt
def dispatch(self, *args, **kwargs):
return super(UploadView, self).dispatch(*args, **kwargs)
def post(self, request, *args, **kwargs):
"""A POST request. Validate the form and then handle the upload
based ont the POSTed data. Does not handle extra parameters yet.
"""
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_upload(request.FILES['qqfile'], form.cleaned_data)
return make_response(content=json.dumps({ 'success': True }))
else:
return make_response(status=400,
content=json.dumps({
'success': False,
'error': '%s' % repr(form.errors)
}))
def delete(self, request, *args, **kwargs):
"""A DELETE request. If found, deletes a file with the corresponding
UUID from the server's filesystem.
"""
qquuid = kwargs.get('qquuid', '')
if qquuid:
try:
handle_deleted_file(qquuid)
return make_response(content=json.dumps({ 'success': True }))
except Exception, e:
return make_response(status=400,
content=json.dumps({
'success': False,
'error': '%s' % repr(e)
}))
return make_response(status=404,
content=json.dumps({
'success': False,
'error': 'File not present'
}))
forms.py
class UploadFileForm(forms.Form):
""" This form represents a basic request from Fine Uploader.
The required fields will **always** be sent, the other fields are optional
based on your setup.
Edit this if you want to add custom parameters in the body of the POST
request.
"""
qqfile = forms.FileField()
qquuid = forms.CharField()
qqfilename = forms.CharField()
qqpartindex = forms.IntegerField(required=False)
qqchunksize = forms.IntegerField(required=False)
qqpartbyteoffset = forms.IntegerField(required=False)
qqtotalfilesize = forms.IntegerField(required=False)
qqtotalparts = forms.IntegerField(required=False)
আমি অনুরূপ সমস্যার মুখোমুখি হয়েছি এবং জ্যাঙ্গো অ্যাডমিন সাইট দ্বারা সমাধান করেছি।
# models
class Document(models.Model):
docfile = models.FileField(upload_to='documents/Temp/%Y/%m/%d')
def doc_name(self):
return self.docfile.name.split('/')[-1] # only the name, not full path
# admin
from myapp.models import Document
class DocumentAdmin(admin.ModelAdmin):
list_display = ('doc_name',)
admin.site.register(Document, DocumentAdmin)