基于java文件上传-原始的Servlet方式
发布时间 - 2026-01-11 02:40:17 点击率:次前言:干了这几个项目,也做过几次文件上传下载,要么是copy项目以前的代码,要么是百度的,虽然做出来了,但学习一下原理弄透彻还是很有必要的。刚出去转了一圈看周围有没有租房的,在北京出去找房子是心里感觉最不爽的时候,没有归属感,房租还不便宜,RT,不能好高骛远,还是脚踏实地一点一点学技术吧,终将有一日,工资会涨的。

java文件上传
传统的文件上传,不用jquery插件的话,就是用form表单提交,项目里用过uploadify,可以异步上传文件,原理我也没研究。现在说传统的form表单上传文件。
文件上传核心:
用<input type=”file”/> 来声明一个文件域。样式如 文件:_____ <浏览>.
必须使用post方式提交表单。
必须设置表单的类型为multipart/form-data.是设置这个表单传递的不是key=value值。传递的是字节码.
新建web项目:
jsp form表单:enctype(编码类型)的默认值就是 application/x-www-form-urlencoded
浏览器查看 http报文:主要参数:Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 接收服务器返回的类型,*/*表示所有。Referer:http://localhost:8888/upload/ 来自哪个网站Accept-Language:zh-CN,zh;q=0.8 :请求回应中首选的语言为简体中文Accept-Encoding:gzip, deflate, br支持的压缩格式User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 用户浏览器类型Host:localhost:8888 主机地址Connection:keep-alive 报文发送完毕后仍然保持连接Cache-Contrp: max-age=0 缓存Content-Length: 41 41字节对文件上传来说,重要的参数是:Content-Type: application/x-www-form-urlencoded这个参数只有post请求才有,默认就是application/x-www-from-urlencoded ,Content-type表示正文类型,get方式没有正文,因为参数在url里。在Servlet里可以用request对象取到Content-type:request.getHeader("Content-type"); 默认的值为 application/x-www-form-urlencoded,如果是get请求,则 request.getHeader("Content-type");为null。下图是get请求时的http头信息:
文件上传,必须设置enctype="multipart/form-data"
from表单:上传一个word:此时的http消息: Content-Type:multipart/form-data; boundary=----WebKitFormBou ndarywYwQ3v1NemO0bPfM 。
其中的 boundary=----WebKitFormBoundary44gVxAkoSg3tk3oR 指的是文件上传的分隔符。
看请求的报文: boundry=xxxxx 标识文件开始,也有文件头,说的是上传的数据的类型,第一个input 是text类型,第二个是二进制,content-type 是application/octet-stream 表示 二进制流。上传图片,Content-Type: image/jpeg,上传文本,Content-Type: text/plain。 二进制流的接收:当表单类型是post类型,切enctype="multipart/form-data",则所有的数据都是以二进制流的形式向服务器上传,所以request.getParameter("xxx") 永远为null,只能通过req.getInputStream(); 获取正文。上传一个txt:Servlet:
package com.lhy.upload;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Administrator
*
*/
@WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")
public class UploadServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String contentType = req.getHeader("Content-type");
System.out.println("contentType: "+contentType);
String name = req.getParameter("name");
System.out.println(name);//null
InputStream is = req.getInputStream();
// ------WebKitFormBoundaryG0ULv7eVfQ1K2PBA
// Content-Disposition: form-data; name="image"; filename="静夜思.txt"
// Content-Type: text/plain
//
//
// ------WebKitFormBoundaryG0ULv7eVfQ1K2PBA--
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String firstLine = br.readLine();//第一行,分隔符
String fileName = br.readLine();
// Content-Disposition: form-data; name="image"; filename="jingyesi.txt"
fileName = fileName.substring(fileName.lastIndexOf("=")+2,fileName.length()-1);
br.readLine();
br.readLine();
String data = null;
//获取当前项目的运行路径
String path = getServletContext().getRealPath("/up");
PrintWriter pw = new PrintWriter(path+"/"+fileName);
while((data = br.readLine()) != null){
if(data.equals(firstLine+"--")){
break ; //读到了文件尾
}
pw.println(data);
}
pw.flush();
pw.close();
is.close();
/* FileOutputStream fos = new FileOutputStream(path+"/"+"b.doc");
// byte[] b = new byte[1024];
int len = 0;
while((len = is.read()) != -1){
fos.write(len);
}
fos.flush();
fos.close();
is.close();*/
}
}
项目里:
例子只是读取了txt,其他的二进制需要使用inputStream读取。
以上这篇基于java文件上传-原始的Servlet方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# java
# 文件上传方式
# JavaServlet的文件上传和下载实现方法
# Java Servlet简单实例分享(文件上传下载demo)
# java基于servlet编写上传下载功能 类似文件服务器
# Java Servlet上传图片到指定文件夹并显示图片
# java基于servlet实现文件上传功能解析
# java基于servlet的文件异步上传
# java基于servlet实现文件上传功能
# java基于servlet使用组件smartUpload实现文件上传
# java web中的servlet3 upload上传文件实践
# 简单操作实现Java jsp servlet文件上传过程解析
# JavaWeb servlet实现下载与上传功能的方法详解
# 表单
# 文件上传
# 上传
# 的是
# 给大家
# 上传文件
# 分隔符
# 来了
# 也有
# 简体中文
# 第一个
# 好高骛远
# 还不
# 可以用
# 几次
# 很有
# 其他的
# 希望能
# 第二个
# 才有
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
个人网站制作流程图片大全,个人网站如何注销?
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
如何用搬瓦工VPS快速搭建个人网站?
如何用狗爹虚拟主机快速搭建网站?
做企业网站制作流程,企业网站制作基本流程有哪些?
Python结构化数据采集_字段抽取解析【教程】
微信小程序 canvas开发实例及注意事项
Laravel如何实现API速率限制?(Rate Limiting教程)
网站制作价目表怎么做,珍爱网婚介费用多少?
Android使用GridView实现日历的简单功能
QQ浏览器网页版登录入口 个人中心在线进入
简历没回改:利用AI润色让你的文字更专业
如何在Windows环境下新建FTP站点并设置权限?
网站制作企业,网站的banner和导航栏是指什么?
清除minerd进程的简单方法
想要更高端的建设网站,这些原则一定要坚持!
Bootstrap整体框架之CSS12栅格系统
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
Laravel如何生成URL和重定向?(路由助手函数)
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何快速登录WAP自助建站平台?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
如何在建站主机中优化服务器配置?
利用JavaScript实现拖拽改变元素大小
Firefox Developer Edition开发者版本入口
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Laravel如何记录自定义日志?(Log频道配置)
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Thinkphp 中 distinct 的用法解析
Laravel怎么在Controller之外的地方验证数据
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
Laravel怎么上传文件_Laravel图片上传及存储配置
如何快速生成橙子建站落地页链接?
EditPlus 正则表达式 实战(3)
PHP 500报错的快速解决方法
Laravel怎么在Blade中安全地输出原始HTML内容
Python自动化办公教程_ExcelWordPDF批量处理案例
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel如何实现事件和监听器?(Event & Listener实战)
googleplay官方入口在哪里_Google Play官方商店快速入口指南
如何实现建站之星域名转发设置?
如何快速上传建站程序避免常见错误?

