django 文件上傳(阿里雲oss)下載(支持大文件下載)

1.文件上傳

Models 設計django

class Upload_File(models.Model):
    image = models.FileField(upload_to='file/%Y/%m',default = 'image/default.png',max_length=100)
    add_time = models.DateTimeField(auto_now_add=True,verbose_name='添加時間')

 

forms 設計json

 

from django import forms
from .models import Upload_File

class UploadFileForm(forms.ModelForm):
    class Meta:
        model = Upload_File
        fields = ['image']

 

settings設計服務器

STATIC_URL = '/static/'


MEDIA_URL = '/media/'  #文件上傳目錄
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') #文件上傳地址

 

View設計(上傳思路:先保存到本地media目錄而後讀取目錄,保存到雲服務器,方法比較笨,可是能實現後期優化)app

#阿里雲OSS的基本配置
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', 'LLLLLLLLLL')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', 'BBBBBB')
bucket_name = os.getenv('OSS_TEST_BUCKET', 'CCCCC')
endpoint = os.getenv('OSS_TEST_ENDPOINT', 'https://oss-cn-beijing.aliyuncs.com')

# 確認上面的參數都填寫正確了
for param in (access_key_id, access_key_secret, bucket_name, endpoint):
    assert '<' not in param, '請設置參數:' + param

# 建立Bucket對象,全部Object相關的接口均可以經過Bucket對象來進行



def GetForm(request):
    """
    請求表單
    """

    file = Upload_File()

    if request.method == 'POST':
        Up_File = UploadFileForm(request.POST, request.FILES)
        if Up_File.is_valid():
            headFile = Up_File.cleaned_data['image']
            file.image = headFile
            print(MEDIA_ROOT)
            file.save()


            print(file.image.name)
            print(file.image.path)

            bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)

            bucket.put_object_from_file('{}/{}'.format('media', file.image.name),'{}/{}'.format('media', file.image.name))


            # # 下載到本地文件
            # bucket.get_object_to_file('media/file/2018/01/1曾經有一份真摯的愛情大話西遊經典片斷.mp4', 'media/file/2018/01/1曾經有一份真摯的愛情大話西遊經典片斷.mp4')


        return HttpResponse('{"status":"success"}', content_type='application/json')

 

URL設計函數

from django.views.static import serve #用於處理上傳文件
from django_upload.settings import MEDIA_ROOT


 # 上傳文件
url(r'^form/$', GetForm, name='go_form'),


# 配置上傳文件的訪問函數
url(r'^media/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT}),

 

HTMLpost

     <form action="{% url 'go_form' %}" method="post" enctype="multipart/form-data" class="smart-green">
        <span class="fl upload-inp-box" style="margin-left:70px;">
            <input type="file" name="image" id="avatarUp" class="js-img-up"/>
        </span>
        <label>
            <span>&nbsp;</span> <br><br><br>

            <input type="submit" class="button" value="提交"/> <br><br>

        </label>
        {% csrf_token %}
     </form>

 

 

2.文件下載:

View優化

def file_down(request):
    """
    文件下載
    """
    def readFile(fn, buf_size=262144):
        f = open(fn, "rb")
        while True:
            c = f.read(buf_size)
            if c:
                yield c
            else:
                break
        f.close()

    path = os.path.abspath(MEDIA_ROOT)
    print(path)
  
  
  #文件相對路徑 path
= 'media/file/2018/01/遙領醫療數據AI項目商業計劃書-20171211.pptx' print(path) response = StreamingHttpResponse(readFile(path)) response['Content-Type'] = 'application/octet-stream' response['Content-Disposition'] = 'attachment;filename=%s' % (urlquote('遙領醫療數據AI項目商業計劃書-20171211.pptx')) #下載後的名字 return response

 

url設計阿里雲

 

#文件下載
url(r'^file_down/$', file_down, name='file_down'),

 

HTMLurl

<button>
     <a href="/file_down/">下載</a>
</button>
相關文章
相關標籤/搜索