首页 > 其他分享 >二十五、文件上传

二十五、文件上传

时间:2024-02-11 23:55:34浏览次数:29  
标签:文件 obj img data request 二十五 document 上传

1、普通上传

<body>
  <form action="/upload.html" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="text" name="user"/>
    <input type="file" name="img"/>
    <input type="submit" value="提交"/>
  </form>
</body>

后台保存文件

def upload(request):
    if request.method=='GET':
        return render(request,'upload.html')
    else:
        # obj=UploadForm(request.POST,request.FILES)
        # if obj.is_valid():
        #     user=obj.cleaned_data['user']
        #     img=obj.cleaned_data['img']
        user=request.POST.get('user')
        img=request.FILES.get('img')

        f = open(img.name,'wb')
        for line in img.chunks():
            f.write(line)
        f.close()
        return HttpResponse('OK')

2、页面上传按钮自定义

<input type="file" /> 生成了页面中“选择文件”的按钮样式无法修改。
设置style="opacity : 0”可以把它隐藏,同时仍然可以点击;
添加一个a标签,将它和“选择文件”按钮放在一个div中;
设置文件input框为绝对定位;这样a标签和文件input 就放在一起了

<body>
  <form action="/upload.html" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="text" name="user"/>
    <div style="position: relative">
      <a href="#">nb上传</a>
      <input type="file" name="img" style="opacity: 0.2;position:absolute;top:0;left:0;"/>
    </div>
    <input type="submit" value="提交"/>
  </form>
</body>

3、后端:基于Form对象处理数据

from django.forms import fields

class UploadForm(forms.Form):
    user=fields.CharField()
    img=fields.FileField()

def upload(request):
    if request.method=='GET':
        return render(request,'upload.html')
    else:
        obj=UploadForm(request.POST,request.FILES)
        if obj.is_valid():
        	user=obj.cleaned_data['user']
        	img=obj.cleaned_data['img']

        f = open(img.name,'wb')
        for line in img.chunks():
            f.write(line)
        f.close()
        return HttpResponse('OK')

4、ajax文件上传

function AjaxSubmit6(){
  // document.getElementById('img').files[0] 获取已选择的文件对象
  var data = new FormData(); //使用FormData来POST时,不需要设置请求头
  data.append('k1','v1');
  data.append('k2',document.getElementById('img').files[0]);
  $.ajax({
    url:'/ajax1.html',
    type:'POST',
    data:data,
    success:function(arg){
      console.log(arg)
    },
    processData:false, // tell jQuery not to process the data
    contentType:false, // tell jQuery not to set contentType
  })
}
function AjaxSubmit7(){
            var xhr = new XMLHttpRequest();
            // send之前设置回调函数
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4){
                    // 接受完毕服务器返回的数据
                    console.log(xhr.responseText);
                }
            };
            var data = new FormData();
            data.append('k1','v1');
            data.append('k2',document.getElementById('img').files[0]);
            xhr.open('POST','/ajax1.html');
            xhr.send(data);
        }

5、基于Iframe+Form上传文件

添加一个隐藏的iframe元素,将form的target=iframe的name,这样form表单提交数据就会通过iframe来提交;
设置文件的input元素属性onchange,选择了文件就会调用onchange的函数,从而让iframe绑定onload函数,并提交数据;
后台保存文件成功后将文件路径返回给页面,iframe加载到数据会调用onload函数,将文件(图片)路径拿到,创建img元素来展示,从而实现预览。

<body>
  <div>
    <h6>基于Iframe+Form上传文件</h6>
    <iframe style="display: none;" id="iframe1" name="ifra1"></iframe>
    <form id="fm1" action="/upload_img.html" method="post" enctype="multipart/form-data" target="ifra1">
      <input type="file" name="k1" onchange="uploadFile();"/>
    </form>
    <h3>预览</h3>
    <div id="previews">
    </div>
  </div>
  <script src="/static/jquery-3.1.1.js"></script>
  <script>
    function reloadIframe1() {
      var ret= this.contentWindow.document.body.innerHTML;
      var obj = JSON.parse(ret);
      console.log(obj.data);
      var tag = document.createElement('img');
      tag.src = obj.data;
      $('#previews').empty().append(tag);
    }
    function uploadFile(){
      document.getElementById('iframe1').onload = reloadIframe1;
      document.getElementById('fm1').submit();
    }

  </script>
def upload_img(request):
    import os
    import uuid

    nid = str(uuid.uuid4())
    ret={'status':True,'data':None,'message':None}
    obj=request.FILES.get('k1')
    file_path = os.path.join('static', nid+obj.name)
    f = open(file_path,'wb')
    for line in obj.chunks():
        f.write(line)
    f.close()
    ret['data'] = file_path
    return HttpResponse(json.dumps(ret))

标签:文件,obj,img,data,request,二十五,document,上传
From: https://www.cnblogs.com/zhlforhe/p/18013638

相关文章

  • 【漏洞复现】用友NC-Cloud系统uploadChunk存在任意文件上传漏洞
    阅读须知花果山的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本......
  • 没有在main.c中显式地包含子模块的头文件,仍然可以实现相同的效果?
    在Keil模块化编程中,每个子模块通常会有自己的.h头文件和.c源文件。这些头文件包含了子模块的函数声明、宏定义和结构体定义等信息,而源文件则包含了子模块的具体实现代码。当你在`main.c中调用子模块的函数时,通常需要包含对应的子模块的头文件,以便在`main.c中能够正确地使用子模块......
  • 十、Django静态文件
    django网络相应基础:1、配置url路由在urls.py中urlpatterns添加路径fromdjango.conf.urlsimporturlfromdjango.contribimportadminfromapp01importviewsurlpatterns=[url(r'^admin/',admin.site.urls),url(r'^index.html$',views.index),......
  • Elasticsearch与文件描述符的恩恩怨怨
    提到Elasticsearch,让笔者最恶心的倒不是它的反人类的DSL设计,而是每次安装都需要修改进程的最大文件描述符。那ES与文件描述符有啥恩怨呢,下面就来唠叨唠叨。首先说说文件描述符、在说说ES为什么要这么多文件描述符。一、文件描述符1、什么是文件描述符文件描述符(Filedescriptor......
  • NET项目&DLL反编译&MSSQL监控&VS搜索&注入&上传
    知识点1.NET普通源码&编译源码2.DLL反编译&后缀文件&指向3.代码审计-SQL注入&文件上传ASPX文件->CSASPX.CSDLL反编译后寻找看核心代码分析漏洞CSASPX.CSDLL反编译文件->ASPX文件寻找确定漏洞进行调试测试代码审计时要把这个反编译文件提取导入到IDE中后期搜索关......
  • C#使用MiniExcel导入导出数据到Excel/CSV文件
    MiniExcel简介简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel尝试以Stream角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。特点:低内存耗用,避免OOM、频繁......
  • 7.读写配置文件和添加缓存
    感觉没什么好总结的,直接上代码吧:配置文件:1添加一个枚举///<summary>///配置键名///</summary>publicenumConfigKey{///<summary>///系统配置///</summary>SystemConfig,///<summary>......
  • 通达信量化资金波段套装指标 专吃波段 适合上班族 某私募团内部公式 源码文件分享
    {股票指标} 本公式由一个量化波段主图,一个量化资金流幅图,一个量化资金警戒幅图,一个量化资金流选股公式组成使用方法:1、安装好公式后,调用组合好2、看量化资金警戒幅图近期是否有量堆出现,量堆越密集红柱逐个升高为佳3、观察量化资金流幅图是否翻红4、观察量化波段主图是......
  • (CCES) CCS 7.0 工程文件中 右上角有 小钥匙标志(转)
    https://blog.csdn.net/csdn392746239/article/details/85985091原因:应该是对单个源文件进行了build选项的操作,小钥匙表示这个源文件跟工程中的其他文件的配置不同。凡是设置过文件属性的,都会出现这个标志,重启是不行的,即是将其删除,如果再新建一个,只要与原来的重名,这个钥匙标志还......
  • 通达信【狙击龙妖起爆】幅图选股公式 精准狙击妖龙 擒获波段大牛 牛气冲天 源码文件分
    {股票指标} 某地金钻指标,价格千多,还加密限时股海网解密源码文件分享,已经解除时间限制,我们在选股公式,分别做了信号选股公式此指标包含一个幅图+四个选股,详细介绍如下,实盘信号截图,我截图的信号例图都是完整的全图,让大家看的一览无余的明白:指标特色:本选股指标出票量适中,但贵......