php文件上传代码Html中表单不能实现文件的上传,限制了一些网页功能 php文件域上传
2022-05-01
以前的Html,表单无法实现文件的上传,这在一定程度上限制了一些网页的功能。规范(即在 Html 中实现基于表单的文件上传)通过添加表单元素
<="POST" ="*.jsp" ="/form-data">
<TYPE="FILE" SIZE="50"><BR>
<TYPE="" ="">
选择粘贴文件时,直接输入本地文件的绝对路径。表单的属性值为*.jsp,表示请求(包括上传的文件)会被发送到*..jsp文件。在这个过程中,实际上实现了文件上传的HTTP方式。 HTTP 协议的通用网关接口 (CGI) 支持从客户端向服务器上传文件。这种上传方式需要浏览器和双方都能够支持。通过类的()方法获取客户端发给服务器的一个数据流,分析上传的文件格式,根据分析结果依次输出多个文件到服务器端的目标文件。本例中的功能由类具体实现。该类的框架如下:
{
(){…}
无效()
{ = .(); }
无效(),,,
{………}
void(){………}
void(){………}
int save()
, ,
{………}
……
}
由 () 方法初始化的运行时环境。使用()方法获取输入流,分析上传文件的格式,将每个上传文件的属性分配给多个File类实例进行处理。这些 File 类实例由类管理。 File类根据每个文件的属性调用其save()方法,将多个文件依次输出到服务器端的目标文件中。 ()方法是关键,用于分析.1协议传输的文件格式。经过测试,我们想出了传输流文件的格式,这对理解()方法很有用。例如,上传我的\tt.txt 文件。格式如下:
//文件分隔符
------------------
//文件头
-: 表单数据;; ="C:\ 和 \.-\我的 \tt.sql"
-类型:文本/
//源文件内容
信息(
null);
//下一个文件的分隔符
------------------
-: 表单数据;; =""
-类型:/-
------------------
从以上文件我们可以看出,HTTP协议在上传多个文件时,会将所有文件放入输入流中,并用一定的分隔符进行区分。其实()方法就是对上面的文件进行分析,确定分隔符的内容,每个文件的内容格式,文件的全路径名,以及文件实际数据的开头和结尾。这里需要注意的是,分隔符是随机的,是传输流文件第一个回车之前的所有字符。
实施过程
()方法是:首先将输入流文件输出到字节数组中,由以下代码实现。
=1024;=0;
for(; < ; += )
试试
{ .();
= .().read(, , - );
}(e){ new (" to .");}
这里使用了循环中的多字节读取方式,上面的循环继续读取数据,直到数组满为止。如果文件完全可用,则文件的所有字节都可用。但是由于网络速度通常比 CPU 慢很多,所以程序很容易在所有数据到达之前清空网络缓冲区。实际上,当多字节读取方法尝试从一个暂时空但打开的网络缓冲区中读取数据时,该方法返回0,这意味着没有数据存在但网络流没有关闭。在这种情况下,单字节方法会阻塞正在运行的程序的执行,所以多字节的行为要优于单字节的 read() 方法。接下来分析字节数组。首先找到分隔符;使用()方法返回文件信息头的值,从中确定源文件的全路径名、源文件的扩展名和源文件的内容格式;使用()方法返回文件的内容数据,并记录文件数据在字节数组中的开始和结束位置。然后生成一个File类的实例,并将文件的全路径名、源文件的扩展名、源文件的内容格式、文件内容数据的起止位置放入属性中File 类实例。找到下一个分隔符,继续重复上述过程,直到分析完成。
二、使用FTP协议上传多个文件
FTP 协议是一种用于传输文件的协议,它规定了相互传输文件的标准。这个功能在java中的实现是借助类来完成的。具体实现过程:首先与FTP服务器建立连接;初始化文件的传输方式,包括和两种方式;将文件输出到文件输入流;读取字节数组中的数据;将数据写入字节数组输出流(使用方法将数据写入网络链接)。这样,一个与源文件同名的文件被复制到服务器上。在这个例子中,使用了()、()、()三个方法来完成文件上传过程。主要实现如下:
{ ; ; ;
void ( , 用户, , 路径)
{
//:FTP服务器的IP地址; user:登录FTP服务器的用户名
//:登录FTP服务器的用户名密码; path:FTP服务器上的路径
尝试{ =new();
.();
.(用户, );
.out.("!");
if (path.()!=0) .cd(path);
.(); } (ex) {.out.(ex);}
}
无效()
{尝试{ .();
} (ex) {.out.(ex);}
}
无效()
{ =();
//从中分析出文件名,作为目标文件名,具体方法没有给出
试试{
os=.put();
java.io.File =new java.io.File();
is=new();
字节[] =新字节[1024];
int c;
((c=is.read())!=-1){ os.(,0,c); }
是.(); os.();
} (ex) {.out.(ex);}
}
}
() 完成与FTP服务器建立连接的功能,使用( )方法打开远程FTP服务器,然后使用(user, )方法登录服务器。远程FTP服务器的登录方式有两种,一种是注册用户登录,另一种是匿名登录。前者要求用户先注册为服务器的客户端,服务器会给客户端一个登录账号和密码,并根据账号和密码链接到服务器。后者要求用户使用特殊的用户名“”和“”,而无需注册才能对远程主机上的公共文件进行有限的访问,并且许多系统现在要求用户使用地址作为密码。出于安全考虑php文件上传代码,大多数匿名 FTP 主机一般只允许远程用户下载文件而不允许上传文件php文件上传代码,这取决于 FTP 服务器的设置。用户可以根据实际情况选择使用两种方式。登录完成后使用的 () 方法将传输模式初始化为字节模式。 () 完成文件上传功能。创建源文件的文件输入流,将输入流写入字节数组,使用方法将字节数组中的数据写入网络链接。由于FTP服务器上的文件被打开网站开发,数据被写入目标文件,从而完成文件上传。 () 需要与服务器断开连接。
以上只是上传单个文件的过程。如果有多个文件,则可以多次调用此上传过程。从以上两种方式可以看出,使用FTP协议上传多个文件是比较简单易实现的。使用FTP协议上传文件一般是客户端编写的程序,服务器端的安全设置比较复杂;而使用HTTP协议上传文件是一个服务器端的应用程序,安全设置比较简单。并且通过测试发现,FTP上传方式在传输大文件时比HTTP上传方式快几十倍甚至数百倍,但在传输小于1M的文件时比HTTP上传方式稍慢。因此,两种传输方式各有优势。