路是方向,代码是时间,知识需积累,经验需摸索。希望对大家有用,有错误还望指出。
要实现一个文件上传和下载的页面,我们需要涉及到 Django 中的以下几个概念/类/函数:
一、在 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多种跨域解决方式
?我们直接创建一个包含web依赖的项目就好了。 然后需要在配置文件配置文件上传的一些设置。这里使用yml文件作为配置文件,如果不懂语法的,请移步前面的系列三,里面有详细解释。
server:
port: 8095
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 30MB
?默认大小为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();
}
?这个方法可以放在启动类里面,也可以自己放置在一个配置类里面,让项目启动的时候能正常加载就行。
?单文件上传,我们需要用后端接受并将文件存储到项目里面或者是自己定义路径。这里以图片作为上传的文件。并且将文件上传到项目里面。
@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键,然后选中多个文件,就能上传了。
?本文讲解了单文件,多文件上传,然后对文件的上传限制条件与访问添加了一些配置。如果你觉得本文对你有用,点个赞,关注表示一下。
*请认真填写需求信息,我们会在24小时内与您取得联系。