Django中的文件操作


一、靜態文件的加載

1、使用步驟

①、在工程目錄下創建static目錄,創建css/js/images等目錄,並添加相關資源

②、在settings.py中配置STATICFILES_DIRS

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

③、在模板中調用

  絕對路徑:

<link rel="stylesheet" href="/static/css/my.css">

  相對路徑:

{% load static %} 或 {% load staticfiles %}
<img src="{% static 'images/bige.jpg' %}">

2、重要配置

①、STATIC_URL

靜態資源的虛擬路徑,會啟動“靜態資源探測器”

②、STATICFILES_DIRS

“靜態資源探測器”會首先去查找STATICFILES_DIRS配置里設置的目錄下的靜態資源;然后會去查找每個app下的static子目錄下的靜態資源

③、STATIC_ROOT

可以通過"python manage.py collectstatic"命令將所有應用的靜態資源收集到STATIC_ROOT指向的目錄中

二、文件上傳

本質上就是文件的讀寫操作,從一個文件讀取,到另外一個文件寫入。

上傳文件所在的表單必須設置enctype="multipart/form-data"

<form method="post"
      action=""
      enctype="multipart/form-data">
    {% csrf_token %}
    <input name="name" placeholder="用戶名"> <br>
    <input type="file" name="photo"><br>
    <button>提交</button>
</form>

1、Python代碼實現

將文件內容打碎,一塊一塊寫入:chunks()

def upload_file(request):
    if request.method == "GET":
        return render(request, 'upload.html')
    elif request.method == "POST":
        icon = request.FILES.get("icon")

        with open("G:\code\django_test\static\img\icon.jpg", 'wb') as save_file:   # 此處使用絕對路徑
            for part in icon.chunks():
                save_file.write(part)
                save_file.flush()  # 寫入一塊就刷新一下,防止堵塞

        return HttpResponse("文件上傳成功")

2、ajax實現

def ajax_upload(request):
    if request.method == 'GET':
        return render(request,'upload_ajax.html')
    else:
        name = request.POST.get('ajaxname')  # 接收文本框中的用戶名
        upload_obj = request.FILES.get('ajaxphoto')  # 接收上傳的文件,返回上傳文件對象
        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        upload_path = os.path.join(BASE_DIR, 'upload','ajax', upload_obj.name)  # 拼接上傳文件的路徑
        with open(upload_path, 'wb') as f:
            for chunk in upload_obj.chunks():
                f.write(chunk)
        data = {
            'status':'900',
            'msg':'恭喜,'+ name + '上傳成功',
            'picpath':'ajax/'+ upload_obj.name,
        }
        return JsonResponse(data)
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax上傳文件</title>
    <script src="{% static 'jquery-3.1.1.js' %}"></script>
</head>
<body>
    {% csrf_token %}
    <p>上傳人: <input type="text" name="name"></p>
    <p>照片: <input type="file" name="photo"></p>
    <input type="button" value="點我上傳" id="btn">
    <span id="msg"></span>
    <img src="" alt="" id="pic">
</body>
</html>
<script>
    $('#btn').click(function(){
        var formData = new FormData(); //用來收集上傳數據的對象
        formData.append('ajaxname',$('input[name="name"]').val()); //添加用戶名
        formData.append('ajaxphoto',$('input[name="photo"]')[0].files[0]); //添加文件
        //alert($('input[name="photo"]')[0].files[0]);
        formData.append('csrfmiddlewaretoken',$('input[name="csrfmiddlewaretoken"]').val());  //添加token
        $.ajax("{% url 'upload:ajax' %}",{
            type:'POST',
            data: formData,
            contentType:false,
            processData:false,
            success:function (data) {
                if(data.status=='900'){
                    $('#msg').html(data.msg);
                    var picpath = data.picpath;
                    $('#pic').attr('src','/static/'+picpath);
                }
            }
        })
    })
</script>

3、Django內置

①、配置

在settings.py文件中聲明上傳的路徑。

MEDIA_ROOT= os.path.join(BASE_DIR, 'static')

②、圖片上傳

ImageField,專門用來處理圖像上傳,需要添加依賴pillow,pillow是專門處理圖像的庫

pip install pillow

ImageFiled中使用upload_to,需要指定上傳后的目錄

photo = models.ImageField(upload_to='upload')  # 此處upload相當於MEDIE_ROOT

③、文件上傳

FileField,與圖片上傳一致

④、文件存儲

class Author(models.Model):
    name = models.CharField(max_length=20)
    photo = models.ImageField(upload_to='upload')
name = request.POST.get("name")
photo = request.FILES.get('photo')
author = Author()
author.name = name
author.photo = photo
author.save()  # 數據庫存儲的是路徑


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM