জ্যাঙ্গোতে কীভাবে একটি ফাইল আপলোড করবেন? [বন্ধ]


668

জ্যাঙ্গোর নবাগত হিসাবে, জাজানো ১.৩ এ আমার আপলোড অ্যাপ তৈরি করতে অসুবিধা হচ্ছে। আমি কোনও আপ-টু-ডেট উদাহরণ / স্নিপেট খুঁজে পাইনি। কেউ কি সর্বনিম্ন তবে সম্পূর্ণ (মডেল, দেখুন, টেমপ্লেট) উদাহরণ কোড পোস্ট করতে পারে?

উত্তর:


1273

ভাই, জ্যাঙ্গো ডকুমেন্টেশনের এই সম্পর্কে ভাল উদাহরণ নেই। এটি কীভাবে কাজ করে তা বুঝতে আমি টুকরো টুকরো করার জন্য 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

1. সেটিংস: মাইপ্রজেক্ট / সেটিংস.পি

ফাইলগুলি আপলোড এবং পরিবেশন করতে আপনাকে জ্যাঙ্গো কোথায় আপলোড করা ফাইল সংরক্ষণ করে এবং কোন ইউআরএল থেকে জ্যাঙ্গো তাদের পরিবেশন করতে হবে তা উল্লেখ করতে হবে। 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',
)

2. মডেল: মাইপ্রজেক্ট / মায়াপ / মডেল.পি

এর পরে আপনার ফাইলফিল্ড সহ একটি মডেল দরকার। এই নির্দিষ্ট ক্ষেত্রটি মিডিয়া / ডকুমেন্টগুলিতে / 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'
    )

4. দেখুন: মাইপ্রজেক্ট / মায়াপ / ভিউ.পি

এমন দৃশ্য যেখানে সমস্ত যাদু ঘটে। কীভাবে 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)

App. অ্যাপ্লিকেশন ইউআরএল: মাইপ্রজেক্ট / মায়াপ / ইউআরএল.পি

দর্শনটি অ্যাক্সেসযোগ্য করার জন্য আপনাকে অবশ্যই এর জন্য ইউআরএল নির্দিষ্ট করতে হবে। এখানে বিশেষ কিছু নেই।

# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url

urlpatterns = patterns('myapp.views',
    url(r'^list/$', 'list', name='list'),
)

Template. টেমপ্লেট: মাইপ্রজেক্ট / মাইএপ / টেম্পলেট / মায়াপ / লিস্ট এইচটিএমএল

শেষ অংশ: তালিকার জন্য টেমপ্লেট এবং এর নীচে আপলোড ফর্ম। ফর্মটিতে এনজাইটাইপ-এ্যাট্রিবিউট সেট করতে হবে "মাল্টিপার্ট / ফর্ম-ডেটা" এবং পদ্ধতিতে "পোস্ট" সেট করা জাজানোতে আপলোড করা সম্ভব। বিশদে ফাইল আপলোডের ডকুমেন্টেশন দেখুন ।

ফাইলফিল্ডের অনেকগুলি বৈশিষ্ট্য রয়েছে যা টেমপ্লেটগুলিতে ব্যবহার করা যেতে পারে। যেমন {{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> 

8. সূচনা

কেবল সিঙ্কডিবি এবং রানসরভার চালান।

> cd myproject
> python manage.py syncdb
> python manage.py runserver

ফলাফল

অবশেষে, সবকিছু প্রস্তুত। ডিফল্ট জ্যাঙ্গো বিকাশ পরিবেশে আপলোড করা দস্তাবেজের তালিকাতে দেখা যায় localhost:8000/list/। আজ ফাইলগুলি / পাথ / টু / মাইপ্রজেক্ট / মিডিয়া / নথি / 2011/12/17 / এ আপলোড করা হয়েছে এবং তালিকা থেকে খোলা যেতে পারে।

আমি আশা করি এই উত্তরটি কাউকে ততটাই সহায়তা করবে যতটা এটি আমাকে সহায়তা করেছিল।


9
জাঙ্গো ডক্সে অবস্থানটি পাওয়া গেছে যা ফাইল আপলোডগুলি দেখায়। এই উত্তরের উদাহরণটি দুর্দান্ত, তবে জ্যাঙ্গো ডক্সের তথ্যটি নতুন প্রকাশের সাথে আপ টু ডেট থাকবে। docs.djangoproject.com/en/dev/topics/http/file-uploads
তাইওয়ানগ্রাফফুট

1
উদাহরণটি জ্যাঙ্গো "1.5" এর জন্য কাজ করে না। এইচটিএমএল {% url list %}হয়ে যায় {% url "list" %}
ম্যাথিউ রিগলার

4
আপনাকে অনেক ধন্যবাদ . এটা সত্যিই আমার জন্য কাজ করে। তবে, আগত দর্শকদের জন্য, পাইথন এবং জ্যাঙ্গোর নতুন সংস্করণগুলির সাথে সর্বোত্তম সামঞ্জস্যের জন্য আপনার গিটহাবের কোডটি পরীক্ষা করা উচিত। উদাহরণস্বরূপ, ভিএস.পি, রেন্ডার_ট_অগ্রহ (() রেন্ডার (অনুরোধ, ...,) সিএসআরএফ ত্রুটি এড়াতে প্রতিস্থাপন করা উচিত। চিয়ার্স।
Huy চেয়ে

1
এটি কি ফরমস ছাড়া সম্ভব?
রোল

1
ফাইলটি .zip, বা অন্যান্য সংক্রামিত ফাইল হতে পারে?
qg_java_17137

75

সাধারণত যখন আপনি 'কেবল একটি কাজের উদাহরণ পেতে' চেষ্টা করছেন তখন 'কেবল কোড লেখা শুরু করা' ভাল। আপনাকে সহায়তা করার জন্য এখানে কোনও কোড নেই, সুতরাং এটি প্রশ্নের উত্তর দেওয়া আমাদের জন্য আরও অনেক বেশি কাজ করে।

আপনি যদি কোনও ফাইল ধরতে চান তবে এইচটিএমএল ফাইলে আপনার কোথাও এরকম কিছু দরকার:

<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

ফাইল আপলোড ডক্সে প্রচুর পরিমাণে তথ্য রয়েছে

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি পৃষ্ঠাটি পুরোপুরি পড়ুন এবং কেবল কোড লেখা শুরু করুন - তারপরে উদাহরণ সহ ফিরে আসুন এবং যখন এটি কার্যকর না হয় তখন ট্রেস স্ট্যাক করুন।


10
ধন্যবাদ হেনরি আসলে আমি ডক্সটি পড়েছি এবং কিছু কোড লিখেছি তবে যেহেতু ডক্সের কিছু ফাঁক রয়েছে (উদাহরণস্বরূপ "কোথাও থেকে আমদানি করা_পলোড করা ফাইল") এবং আমার কোডটি ত্রুটিযুক্ত ছিল, তাই ভেবেছিলেন যে আমি যদি একটি কার্যকারী উদাহরণ থেকে শুরু করতে পারি তবে এটি আরও ভাল হত would ।
qliq

26
ক্বিলিকের সাথে একমত একটি সহজ কাজের উদাহরণ হ'ল ডকস নয়,
নবাবিদের

11
enctype="multipart/form-data"কি আমি এই কাজ করতে প্রয়োজন ধন্যবাদ!
জন-চার্লস

5
ফর্ম ট্যাগগুলির মধ্যে কেবল {% csrf_token% miss মিস করবেন না।
jonincanada

এটি কি ফর্মস থেকে ফর্মগুলি ছাড়া করা সম্ভব? পিওয়াই?
রোল

71

ডেমো

গিথুব রেপো দেখুন, জাঙ্গো 3 এর সাথে কাজ করে

একটি ন্যূনতম জ্যাঙ্গো ফাইল আপলোড উদাহরণ

1. একটি জাঙ্গো প্রকল্প তৈরি করুন

স্টার্টপ্রজেক্ট চালান ::

$ django-admin.py startproject sample

এখন একটি ফোল্ডার ( নমুনা ) তৈরি করা হয়েছে।

2. একটি অ্যাপ্লিকেশন তৈরি করুন

একটি অ্যাপ্লিকেশন তৈরি করুন ::

$ cd sample
$ python manage.py startapp uploader

এখন uploaderএই ফাইলগুলির সাথে একটি ফোল্ডার তৈরি করা হয়েছে ::

uploader/
  __init__.py
  admin.py
  app.py
  models.py
  tests.py
  views.py
  migrations/
    __init__.py

3. আপডেট

উপর 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/'

4. আপডেট url.py

মধ্যে 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)

5. আপডেট মডেল.পি

আপডেট uploader/models.py::

from django.db import models
class Upload(models.Model):
    upload_file = models.FileField()    
    upload_date = models.DateTimeField(auto_now_add =True)

6. আপডেট ভিউ.পি

আপডেট 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

7. টেমপ্লেট তৈরি করুন

একটি ফোল্ডার নমুনা / আপলোডার / টেম্পলেট / আপলোডার তৈরি করুন

একটি ফাইল তৈরি করুন 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 /


2
শেষ লাইনটি ব্যতীত নিখুঁত - লোকালহোস্ট.কম হওয়া উচিত: ৮০০০ / আপলোড> এটি জাজানো ১.6 এবং পাইথন ৩.৩ এর জন্য কাজ করেছে।
স্টিভ

5
পুনরায় ব্যবহারযোগ্য ডিজেঙ্গো অ্যাপ্লিকেশন ডিজাইনের প্যাটার্নের জন্য +1
মার্সেল

1
আকসেলি FileFieldকিছুক্ষণ সুহেল ব্যবহার করেছেন ImageField, কেউ দয়া করে পছন্দগুলি ব্যাখ্যা করতে পারেন?
ডিভিটান

@dtqq আমি এর সাথে উত্তরটি আপডেট করেছি FileFieldImageFieldশুধুমাত্র চিত্র আপলোড করার জন্য। আপডেটটি জাঙ্গো 1.11 এর সাথে কাজ করবে।
সুহাইলস


29

আমি অবশ্যই বলব যে আমি জঞ্জো বিভ্রান্তিতে ডকুমেন্টেশনটি পেয়েছি। এছাড়াও সহজ উদাহরণের জন্য কেন ফর্মগুলি উল্লেখ করা হচ্ছে? ভিউ.পি-তে কাজ করার উদাহরণটি হ'ল: -

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>

এই উদাহরণগুলি আমার কোড নয়, সেগুলি আমি খুঁজে পাওয়া অন্য দুটি উদাহরণ থেকে খুঁজে পেয়েছি। আমি জ্যাঙ্গোর একটি আপেক্ষিক প্রাথমিক তাই খুব সম্ভবত আমি কিছু মূল বিষয় অনুপস্থিত।


3
A FileFieldএবং a ব্যবহার না করার জন্য +1 model.Form। নতুনদের জন্য (এবং তুচ্ছ কাজগুলির জন্য), উপরে দেখানো মত আপলোড করা ফাইলগুলির ম্যানুয়াল প্রসেসিং কম বিভ্রান্তিকর।
আনিসআহমেড 777

গন্তব্য = উন্মুক্ত (পথ, 'ডাব্লুবি') ফাইল বাইট সহ লেখার সময়
বিপুল রায় ১৯

20

আমারও অনুরূপ প্রয়োজন ছিল। নেটে বেশিরভাগ উদাহরণগুলি মডেল তৈরি করতে এবং ফর্মগুলি তৈরি করতে বলছে যা আমি ব্যবহার করতে চাই না। এখানে আমার চূড়ান্ত কোড।

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 %}

ভাল কারণ মাঝে মধ্যে কেউ কেবল ফাইলের সামগ্রীগুলি ব্যবহার করতে চায় আপলোডটি সংরক্ষণ করে না ...
nemesisfixx

17

হেনরির উদাহরণটিতে প্রসারিত :

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আপলোডকৃত ফাইল অবজেক্টের সাথে আপনার ভিউ থেকে এই ফাংশনটি কল করতে পারেন । এটি ফাইল সিস্টেমে একটি অনন্য নাম (মূল আপলোড হওয়া ফাইলের ফাইল নাম সহ পূর্ববর্তী) সহ ফাইলটি সংরক্ষণ করবে এবং সংরক্ষণিত ফাইলের পুরো পথটি ফিরিয়ে দেবে। আপনি ডাটাবেসে পাথটি সংরক্ষণ করতে পারেন এবং পরে ফাইলটি দিয়ে কিছু করতে পারেন।


ইমরান, আমি আমার দৃষ্টিতে আপনার কোডটি চেষ্টা করেছিলাম কিন্তু এই ত্রুটিটি পেয়েছি: 'ডাব্লুএসজিআইআরআইকিউস্ট' অবজেক্টটির কোনও 'নাম' নেই।
qliq

2
আপলোড করা ফাইল অবজেক্ট ( request.FILES['myfile']) এ পাস করুন handle_uploaded_file, requestনিজেই নয়।
ইমরান

আমি কি এটি সরাসরি ডাটাবেসে সংরক্ষণ করতে পারি? stackoverflow.com/questions/24705246/…
আলেকজান্দ্রিক

prefix=source.nameএটি ব্যবহার করে ফাইলের শেষে অতিরিক্ত অক্ষর যুক্ত হয়েছে, ফাইল এক্সটেনশনের সাথে বিশৃঙ্খলা। যেমন upload.csvপরিবর্তিত হয়েছে upload.csv5334suffix=source.nameআমার জন্য এটি স্থির করার জন্য এটি পরিবর্তন করা ।
তাহরীম ইকবাল

13

এখানে এটি আপনাকে সহায়তা করতে পারে: আপনার মডেলগুলিতে একটি ফাইল ক্ষেত্র তৈরি করুন 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)

এবং আপনার টেমপ্লেটে সেই ক্ষেত্রটিও ব্যবহার করুন।


1
আপনি যখন সংরক্ষণ করতে চান এমন ফাইলগুলির সাথে ম্যানুয়ালি মেতে উঠতে হবে এটি কার্যকর। যদি তা হয় তবে আপনার এই বিভাগটিরও প্রয়োজন হতে পারে: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
এএন

11

আপনি ফাইন আপলোডারে সার্ভারের উদাহরণগুলি উল্লেখ করতে পারেন, যার জ্যাঙ্গো সংস্করণ রয়েছে। 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)

7

এই পদ্ধতির কোনও অসুবিধা রয়েছে কিনা তা নিশ্চিত নন তবে ভিউ.পি-তে আরও কম ন্যূনতম:

entry = form.save()

# save uploaded file
if request.FILES['myfile']:
    entry.myfile.save(request.FILES['myfile']._name, request.FILES['myfile'], True)

0

আমি অনুরূপ সমস্যার মুখোমুখি হয়েছি এবং জ্যাঙ্গো অ্যাডমিন সাইট দ্বারা সমাধান করেছি।

# 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)

[লিঙ্কের বিবরণটি এখানে প্রবেশ করুন] [1] [লিঙ্কের বিবরণটি এখানে প্রবেশ করুন] [2] [1]: youtu.be/tlZM33opY [2]: youtu.be/klhMYMc3PlY
uda123
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.