文件上传与下载--初入茅庐必先知

本文详细介绍文件上传的基本原理,包括POST提交方式、multipart/form-data类型、boundary分隔符使用等内容,并阐述了后台处理流程及文件下载时如何避免文件名乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上传

  • 提交方式:post
  • 表单enctype 属性:multipart/form-data
  • 上传类型为file
  • 请求头信息:Content-Type multipart/form-data; boundary=
    —————————-99723099725366,
    boundary的值为随机产生的分隔符,会在post的请求体中分割参数
  • post数据体中,文件类型的Content-Disposition:包含一个filename属性

如:

form的post数据提交:
        -----------------------------99723099725366
        Content-Disposition: form-data; name="username"

        kk
        -----------------------------99723099725366
        Content-Disposition: form-data; name="file1"; filename="python安装.txt"
        Content-Type: text/plain

        ÅäÖû·¾³±äÁ¿£º
        E:\software\python2.7.13;E:\software\python2.7.13\Scripts
        °²×°¿â:
        pip install MySQLdb

        pip install bs4
        pip install BeautifulSoup
        pip install lxml
        -----------------------------99723099725366--

当了解了上传的原理后,后台做处理就很明确了:
1.判断请求头Content-Type是否包含multipart/form-data,包含则进行文件处理
2.通过boundary分隔符的值对post提交数据进行处理,即数据分割
3.获取到文件输入流后,即可根据需求设置文件保存路径,进行重命名等处理
4.通过输出流输出文件,结束后关闭输入流、输出流

下载

  • 根据文件名或者文件路径定位文件,具体的策略主要根据自己的需求,总之需要系统能找到的文件全路径。
  • 获取输入流,从目标文件获取输入流。
  • 根据文件路径获取文件输入流,进行文件输出,通过配置response下载文件
  • 设置response属性,包括CharacterEncoding,Content-disposition,Content-Length,注意文件名称会因为浏览器的不同而出现乱码,解决方法如下
if(userAgent.contains("MSIE") ||userAgent.contains("rv:11")){
    fileName = URLEncoder.encode(fileName, "UTF-8");
}else{
    fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
 }
 fileName为文件名,IE10及以下用MSIE判断,IE11用rv:11判断。

 response.setHeader("Content-disposition",
                String.format("attachment; filename=\"%s\"", fileName)); 
 response.setHeader("Content-Length", String.valueOf(fileLength));
 response.setCharacterEncoding("UTF-8");
 response.setHeader("Content-Length", String.valueOf(fileLength));

不同浏览器下载弹窗不一样,下载的主要的问题是文件名乱码问题。
结语

文件的上传下载基本思路就是这些,稍后章节我会发布具体的上传下载代码,包括基本的servlet上传下载、使用springmvc的MultipartFile进行文件上传示例。

详细java代码:http://download.youkuaiyun.com/detail/csdnindex/9874608

### 如何在 Windows 11 上下载并安装 1Panel 尽管 1Panel 是一款主要用于 Linux 的运维管理面板,但在 Windows 环境下可以通过特定方式运行它。以下是具体方法: #### 使用 Docker 在 Windows 11 上安装 1Panel 由于 1Panel 提供了基于容器化的部署方案,因此可以利用 Docker 来完成其安装。 1. **Docker Desktop 安装** - 首先,在 Windows 11 上安装 Docker Desktop 工具[^3]。确保启用 WSL2 支持功能。 2. **拉取官方镜像** 执行以下命令来获取 1Panel 的官方 Docker 镜像: ```bash docker pull 1paneldev/1panel:latest ``` 3. **启动容器** 启动容器时需指定端口映射和其他要参数: ```bash docker run -d --name 1panel \ -p 80:80 \ -v /var/lib/docker/volumes/1panel:/data \ 1paneldev/1panel:latest ``` 这里 `-p` 参数用于将主机的 80 端口映射到容器内的 Web 服务端口;`-v` 则挂载数据卷以便持久化存储配置文件和日志信息[^1]。 4. **验证安装状态** 访问浏览器中的 `http://localhost` 或者实际 IP 地址确认界面加载正常,并按照提示设置管理员账户密码等初始选项。 #### 解决可能遇到的问题 如果上述过程出现问题,请参考已知 Q&A 资料进行排查: - 如果无法连接至本地实例,请检查防火墙规则是否允许 HTTP 流量通过; - 对于某些特殊网络环境下的 DNS 解析错误,则尝试手动修改 `/etc/resolv.conf` 文件增加公共 DNS 服务器地址记录。 ```python # 示例 Python 脚本片段展示如何读取 resolv.conf 并添加 Google Public DNS with open('/etc/resolv.conf', 'a') as f: f.write('nameserver 8.8.8.8\n') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值