整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

用django4、python3、html5、css

用django4、python3、html5、css3写出一个文件上传、下载的页面

路是方向,代码是时间,知识需积累,经验需摸索。希望对大家有用,有错误还望指出。

要实现一个文件上传和下载的页面,我们需要涉及到 Django 中的以下几个概念/类/函数:

  1. models.Model:定义数据库模型,存储文件信息;
  2. forms.ModelForm:定义文件上传表单,用于提交文件到后端处理;
  3. views.View:处理上传、下载的逻辑;
  4. HttpResponse:返回下载的文件;
  5. FileField:Django 中的文件上传字段;
  6. FileResponse:返回文件的 HTTP 响应对象。

一、在 models.py 文件中定义一个 File 模型,用于存储上传的文件和文件相关信息。

from django.db import models

class File(models.Model):

filename=models.CharField(max_length=100)

file=models.FileField(upload_to='uploads/')

created_at=models.DateTimeField(auto_now_add=True)

代码中定义了一个名为 File 的模型,包含了文件名、文件、创建时间三个字段,并规定文件上传到 uploads/ 文件夹下。

二、在 forms.py 文件中,定义一个 FileForm 表单,用于提交文件到后端处理。

from django import forms

from .models import File

class FileForm(forms.ModelForm):

class Meta:

model=File

fields=['filename', 'file']

代码中定义了一个名为 FileForm 的表单类,它继承自 Django 的 ModelForm,并以 File 模型为模板。fields 属性定义了需要提交的字段。class Meta: model=File fields=['filename', 'file']

三、在 views.py 文件中,定义处理文件上传和下载的视图函数。

from django.shortcuts import render, redirect

from django.http import FileResponse

from django.views import View

from .models import File

from .forms import FileForm

class FileView(View):

def get(self, request):

files=File.objects.all().order_by('-created_at')

form=FileForm()

return render(request, 'files.html', {'files': files, 'form': form})

def post(self, request):

form=FileForm(request.POST, request.FILES)

if form.is_valid():

form.save()

return redirect('file_list')

else:

return render(request, 'files.html', {'form': form})


class FileDownloadView(View):

def get(self, request, file_id):

file=File.objects.get(pk=file_id)

response=FileResponse(open(file.file.path, 'rb'))

response['Content-Disposition']='attachment; filename=' + file.filename

return response

代码中定义了两个视图函数,一个用于显示上传文件列表和提交表单,一个用于下载文件。其中 FileView 用于处理 GET 和 POST 请求,并加载模板 files.html;FileDownloadView 用于下载文件,将文件二进制数据返回给客户端。

四、定义前端模板,在 templates 目录下创建名为 files.html 的模板文件,用于显示上传文件列表和提交表单。

<h2>Upload File</h2> *****上传******

<form method="post" enctype="multipart/form-data">

{% csrf_token %}

{{ form.as_p }}

<button type="submit">Upload</button> </form>

<h2>Download Files</h2> *****下载*****

<ul>

{% for file in files %}

<li><a href="{% url 'file_download' file.id %}">{{ file.filename }}</a></li>

{% empty %}

<li>No files found.</li>

{% endfor %} </ul>

代码中用 html 的 form 标签以及 Django 的 csrf_token 安全验证提供了上传文件的表单。展示已上传的文件,通过从 model 中获取数据生成文件列表。

以上是一个实现文件上传和下载的基本示例,它涉及到了 Django 中的一系列概念、类和函数,其中包括两个关键的视图函数,即处理文件上传的 FileView,以及处理文件下载的 FileDownloadView。这两个视图函数实现了对于文件的上传、下载、展示。前端通过 html 文件上传的表单 形式 提交数据,后端通过 models.Model 和 forms.ModelForm 等定义实现数据存储和数据处理。最终,前端通过 FileResponse 实现文件下载。

天小编给大家带来的是html表单提交教程,非常简单!

话不多说直接进入教程

首先要注意的事项:

第一:因为这节课涉及到了php所以本地要安装php

在这里小编用的是phpStudyphpStudy(特点简单很适合本地开发测试)

phpStudy界面

第二:在php编码里一定要注意不要编写错误

<?php //为开头 //为结尾?>

<?php 这里写php代码 ?>

要切记php代码要以分号未结束 “;”

首页我们到我们刚刚安装的软件根目录下,找到www这个文件夹

双击打开建立一个新文件夹(在这我命名为了表单的拼音你们可以自己命名为你们想命名的名字,切记不能用中文)

在打开刚刚建立好的文件夹创建两个文件分别命名为orderform.html和processorder.php(当然你也可以自己取名)

我们用编程软件打开这两个新建文件(这里我用的是Sublime Text 3)

我们首先给orderform.html写下如下代码

然后我们开始写建立表单

我们访问本地连接看一下效果

我们在给php写入代码

以下为注意事项

<!--<?php //为php代码 eoch为输出代码 $_POST为接收html提交过来的数据 $tireqty=$_POST['tireqty']

//$sj=$_POST['sj']

//$dz=$_POST['dz'] 为给建立的变量赋值? echo "$tireqty";为输出这个变量-->

首先我们写入和html一下的html代码

在写入php接收函数

完成效果

以下是html里的代码

<!DOCTYPE html>

<html>

<head>

<!--这里编码为utf-8国际编码-->

<meta charset="utf-8">

<!--这里为网站标题-->

<title>表单</title>

</head>

<body>

<!--action为提交的页面 method为提交类型 分为两种一种为post还一种为get -->

<form action="processorder.php" method="post">

<!--border="0"为边框粗细-->

<table border="0">

<!-- bgcolor="#cccccc"为表格背景颜色这里为灰色 -->

<tr bgcolor="#cccccc">

<td>参数</td>

<!-- aligan="center"为表格居中 -->

<td align="center">数据</td>

</tr>

<tr>

<td>姓名</td>

<!-- <input type="text" name="tireqty" size //这里为type为提交类型

text为文本类型 name为名称和class一样 size为字体大小-->

<td align="center"><input type="text" name="tireqty" size="3"/></td>

</tr>

<tr>

<td>手机</td>

<td align="center"><input type="text" name="sj" size="3"/></td>

</tr>

<tr>

<td>地址</td>

<td align="center"><input type="text" name="dz" size="3"/></td>

</tr>

<tr>

<!-- <input type="text" value="提交" value为input 元素的值 colspan为合并-->

<td colspan="0" align="center"><input type="submit" value="提交"/></td>

</tr>

</table>

</form>

</body>

</html>

以下是php中代码

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>接收</title>

</head>

<body>

<form>

<?php

$tireqty=$_POST['tireqty'];

$sj=$_POST['sj'];

$dz=$_POST['dz'];

?>

<table border="0">

<tr>

<td>参数</td>

<td align="center">数据</td>

</tr>

<tr>

<td>姓名</td>

<td align="center"><?php echo "$tireqty"; ?></td>

</tr>

<tr>

<td>手机</td>

<td align="center"><?php echo "$sj"; ?></td>

</tr>

<tr>

<td>地址</td>

<td align="center"><?php echo "$dz"; ?></td>

</tr>

</table>

</form>

</body>

</html>

谢谢观看,喜欢的就收藏加关注吧!

pringBoot系列(九)分分钟解决文件上传

往期推荐

idea新建springboot项目

SpringBoot系列(二)入门知识讲解

SpringBoot系列(三)项目配置文件详解

Springboot系列(四)web静态资源配置

SpringBoot笔记(五)Mybatis整合,详解版

SpringBoot系列(六)thymeleaf完整详细版

SpringBoot系列(七)Api接口文档swagger详解

SpringBoot系列(八) 分分钟学会SpringBoot多种跨域解决方式

1.项目搭建与配置

?我们直接创建一个包含web依赖的项目就好了。 然后需要在配置文件配置文件上传的一些设置。这里使用yml文件作为配置文件,如果不懂语法的,请移步前面的系列三,里面有详细解释。

server:
  port: 8095

spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 30MB
  • max-file-size 设置能接受的文件最大的大小,记得是MB,或KB
  • max-request-size 设置一次上传的所有文件的大小。

?默认大小为1MB

?除了可以用配置文件配置还可利用java配置,如下

@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory=new MultipartConfigFactory();
    //上传的单个文件最大值   KB,MB 这里设置为10MB
    DataSize maxSize=DataSize.ofMegabytes(10);
    DataSize requestMaxSize=DataSize.ofMegabytes(30);
    factory.setMaxFileSize(maxSize);
    /// 设置一次上传文件的总大小
    factory.setMaxRequestSize(requestMaxSize);
    return factory.createMultipartConfig();
}

?这个方法可以放在启动类里面,也可以自己放置在一个配置类里面,让项目启动的时候能正常加载就行。

2.文件上传

?单文件上传,我们需要用后端接受并将文件存储到项目里面或者是自己定义路径。这里以图片作为上传的文件。并且将文件上传到项目里面。

@RestController
@RequestMapping("/file")
public class FileController {
    @PostMapping("/uploadFile")
    public String uploadFile(MultipartFile file, HttpServletRequest request)  {
        if (file.isEmpty()){
            return "上传的文件不能为空!请重新上传";
        }
        if (file.getSize()<=0){
            return "上传的文件大小需要大于0kb";
        }
        System.out.println(file.getContentType());//image/png
        Date date=new Date();
        Long time=date.getTime();
        String originFileName=file.getOriginalFilename();//获取文件原始的名称
        String newFileName=time+originFileName;
        //获取项目运行的绝对路径
        String filePath=System.getProperty("user.dir");

        //由于我是创建的多模块项目,所以获取到的项目运行路径为外层的项目路径,
        // 这时候我们就需要在项目相对路径这里加上项目的名称demo-upload
        String newFilePath=filePath+"\\demo-upload\\src\\main\\resources\\static\\images\\";

        //当然你也可以自己设置一个绝对路径用于图片上传,文件上传。
        //比如说:D:\\images\\
        File file1=new File(newFilePath);

        if (!file1.exists()){
            file1.mkdirs();
        }
        FileOutputStream fileOutputStream=null;
        try {
            fileOutputStream=new FileOutputStream(newFilePath+newFileName);
            fileOutputStream.write(file.getBytes());
            fileOutputStream.flush();
            fileOutputStream.close();
            return "localhost:8095/images/"+newFileName;
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
        return "上传失败";
    }
}

代码说明:

?在代码里,我们可以利用参数file来判断这个文件是否为空,或者将这个文件的后缀名拿出来,判断这个文件的类型是否符合我们的要求,利用getContentType() 方法,如果你是上传的png图片,那么打印出来的就是image/png 其他类型的图片就是其他类型。我们为了区分图片,可以利用当前时间的getTime方法获得的数字来作为图片的前缀,也可以用其他的数字或者字符串。都不想说了,码字太累了。接下来获取当前项目运行的路径,由于我是创建的多模块项目,所以这个获取的路径需要再加上项目名称,后面加上我们需要上传的文件存储的位置,一般在resources文件下面。然后判断这个存储文件的文件夹是否存在,如果不存在就需要创建一个文件。然后利用字节流,将数据写到文件中,返回可访问的路径。

?前端代码,我直接在static目录下面创建了一个upload.html文件,然后我们在文件里面写入一下内容

<p>单文件上传</p>
<form action="/file/uploadFile" method="POST" enctype="multipart/form-data">
    文件:<input type="file" name="file"/>
    <input type="submit" />
</form>

?它的action对应了我们controller里面访问上传文件的对应的方法的路径,method属性是post,与后端一致。type为file的input框的name属性需要与controller里面的接受对象MultipartFile 一致,如果不一致的话后端无法接受到数据。如果你已经写好后端,而前端后端参数不一致,你可以给后端参数加上一个注解。@RequestParam("file") 这个注解放在MultipartFile的前面,这样即使你的参数名字不是file,也能正确接受到数据。

?将文件上传之后,那个返回的路径应该是不能直接访问到图片的,会显示404,我们需可以添加以下配置。

@Configuration
public class ResourceConfigAdapter implements WebMvcConfigurer {


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //获取文件的真实路径
        String path=System.getProperty("user.dir")+"\\demo-upload\\src\\main\\resources\\static\\images\\";
        String os=System.getProperty("os.name");
        if (os.toLowerCase().startsWith("win")) {
            registry.addResourceHandler("/images/**").
                    addResourceLocations("file:" + path);
        }

    }
}

?这里的java动态配置比利用的yml的配置更灵活,在知道文件要存储的位置的情况下,可以自己在yml文件里面加配置。然后我们运行项目,如下:

?上传一张图片,返回可访问的路径

?然后我们将这个URL复制到浏览器,运行,就能访问图片了。

?这是单文件上传,然后可能你需要做多文件上传,很简单,后端做一个循环就行了,然后利用MultipartFile的数组接受文件,对前端做一点修改。

 @PostMapping("/uploadFiles")
public String uploadFiles(MultipartFile[] files,HttpServletRequest request) {
    StringBuilder paths=new StringBuilder();
    for (MultipartFile file:files) {
        //中间的代码和上面的一样
        try {
            //这里根据实际情况修改,可以用数组
            paths.append("localhost:8095/images/"+newFileName+"\n");
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }
    return paths.toString();
}

?前端稍微修改一下

<p>多文件上传</p>

<form action="/file/uploadFiles" method="POST" enctype="multipart/form-data">
    文件:<input type="file" name="files" multiple="multiple"/>
    <input type="submit"/>
</form>

?这就完成了多文件的上传,在上传的时候你需要按住Ctrl键,然后选中多个文件,就能上传了。

3.总结

?本文讲解了单文件,多文件上传,然后对文件的上传限制条件与访问添加了一些配置。如果你觉得本文对你有用,点个赞,关注表示一下。