用
Java
编写的、协议和平台都独立的服务器端组件,使用请求/响应的模式,提供了一个基于
Java
的服务器解决方案。本文将从
文件
传输的基本原理入手,分析如何用
java
进行
文件
的上传,并提出解决方案。
一、基本原理
通过 HTML 上载
文件
的基本流程如下图所示。浏览器端提供了供用户选择提交内容的界面(通常是一个表单),在用户提交请求后,将
文件
数据和其他表单信息编码并上传至服务器端,服务器端(通常是一个 cgi 程序)将上传的内容进行解 码了,提取出 HTML 表单中的信息,将
文件
数据存入磁盘或数据库。
A)填写表单并提交
通过表单提交数据的方法有两种,一种是 GET 方法,另一种是 POST 方法,前者通常用于提交少量的数据,而在上传
文件
或大量数据时,应该选用 POST 方法。在 HTML 代码中,在 <form> 标签中添加以下代码可以页面上显示一个选择
文件
的控件。
<input type="file" name="file01">
在页面中显示如下(可能随浏览器不同而不同)
可以直接在文本框中输入
文件
名,也可以点击按钮后弹出供用户选择
文件
的对话框。
B)浏览器编码
在向服务器端提交请求时,浏览器需要将大量的数据一同提交给 Server 端, 而提交前,浏览器需要按照 Server 端可以识别的方式进行编码,对于普通的表单数据,这种编码方式很简单,编码后的结果通常是 field1=value2&field2=value2&… 的形式,如 name=aaaa&Submit=Submit。这种编码的具体规则可以在 rfc2231 里查到, 通常使用的表单也是采用这种方式编码的,Servlet 的 API 提供了对这种 编码方式解码的支持,只需要调用 ServletRequest 类中的方法就可以得到 用户表单中的字段和数据。
这种编码方式( application/x-www-form-urlencoded )虽然简单,但对于传输大块的二进制数据显得力不从心,对于传输这类数据,浏览器采用了另一种编码方式,即 "multipart/form-data" 的编码方式,采用这种方式,浏览器可以很容易的表单内的数据和
文件
一起。这种编码方式先定义好一个不可能在数据中出现的字符串作为分界符,然后用它将各个数据段分开,而对于每个数据段都对应着 HTML 页面表单中的一个 Input 区,包括一个 content-disposition 属性,说明了这个数据段的一些信息,如果这个数据段的内容是一个
文件
,还会有 Content-Type 属性,然后就是数据本身。 这里,我们可以编写一个简单的 Servlet 来看到浏览器到底是怎样编码的。
实现流程:
重载 HttpServlet 中的 doPost 方法
调用 request.getContentLength() 得到 Content-Length ,并定义一个与 Content-Length 大小相等的字节数组 buffer 。
从HttpServletRequest 的实例 request 中得到一个 InputStream, 并把它读入 buffer 中。
使用 FileOutputStream 将 buffer 写入
指定
文件
。
// ReceiveServlet.
java
import
java
.io.*;
import
java
x.servlet.*;
import
java
x.servlet.http.*;
//示例程序:记录下Form提交上来的数据,并存储到Log
文件
中
public class ReceiveServlet extends HttpServlet
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException
int len = request.getContentLength();
byte buffer[] = new byte[len];
InputStream in = request.getInputStream();
int total = 0;
int once = 0;
java
获取
文件
的路径问题在
java
中读取
读取文件
,经常因为路径的问题
找
不到
,此文用于记录如何定位
文件
的简单方法。本基于springboot做的测试,主要是构建工程方便,所用的方法都是JDK中的方法,主要测试有”/“和没有""的问题,以及getResourceAsStream(String string)和getResource(String string)的问题。1.项目结构解释一下,主要有两个...
系统
找
不到
指定
文件
解决方法如下:目录路径太长,这个
文件
找
不到
,是因为目录路径太长,windows识别不了这么长的目录,首先,这个目录上级目录已经是windows的。2.检查
文件
路径是否正确
3.另外,使用OutputStream时,如果
文件
不存在,会自动创建
文件
。
java
中
找
不到
文件
是什么情况
,如果
文件
夹不存在,就会报错"
系统
找
不到
指定
的路径",使用下面代码先创建
文件
夹
File fileDir = new File(“C:/test/”);
//main方法
public static void main(String[] args) throws IOException {
String srcpath = "day11_data/img/cropped-1920-1080-1012576.jpg";
String dppath = "day11_data/d/bbb.jpg";
copyFile(srcpath, dppath);
//copyFileB
使用
java
读取jar或war下的配置
文件
,是开发者经常需要处理的事情,大家是不是经常遇到FileNotFoundException呢?
java
读取文件
的方式也有很多,比如new File(),Class.getResource(),ClassLoader.getResource(),这些方式的差别是什么呢?开源框架struts2的ClassLoaderUtils和Spring提供ClassPat
(这段代码位于Src_exp2_3.
java
中)
public static String getValue(String key) throws IOException{
Properties pro = new Properties();
// here
FileReader in = new FileReader("pro.txt");
pro.load(in);
in.close();
使用bufferedreader上传
文件
时,获得客户端传来的MultipartFile,进行读取的时候,
InputStream inputstream = file.getInputStream()
看到有人
提示
,
你的这一行报错,InputStream inStream=fm.getInputStream();读
不到
文件
,是应为fm是临时
文件
,上传成功后已经不存在了,所以你试图读取时报
找
不到
文件
的错误。
将上面获取inputstream的语句移动到接口调用的最顶部,即接口刚调用就进行下面操
刚开始编写
java
代码时,肯定会遇到各种各样的bug,当然对于初学者这也是能理解的,首先来说一个比较常见的错误,如下:
一般编写新的程序时,都是从Hello,World开始的,比如在DOS上运行
java
c Hello.
java
时,就会报错:
找
不到
文件
遇到这个问题,首先就要从以下几方面排除
1、检查环境变量是否配置正确,例如输出一个
java
c指令,能输出帮助信息,说明配置信息无...