当前位置:首页 » 文件管理 » 文件上传原理

文件上传原理

发布时间: 2022-01-15 11:44:23

① 文件上传的基本原理,用文字详细说明一下

我借助别人的资料,感觉挺详细,仔细研究一下吧
中文件上传与下载1。上传文件流程

先通过用户提交文件,保存文件到服务器端,然后在写入数据库中,每次到下载页面时从数据库中读出文件,生成文件在服务器目录中,以下。。。

文件上传后保存文件到服务器中jsp,

upFile.jsp

<%@ page contentType="text/html; charset=utf-8" language="java" %>
< import="java.util.List;"%>

<html>
<head>
<title>上传文件</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<base target="_self">
<link href="Css/style.css" rel="stylesheet">
<script type="text/javascript">
function check(){
var file = document.getElementById("file1").value;
if(file == ""){
alert('请选择要上传的文件');
return false;
}else{
window.returnValue=file;
return true;
}
}
</script>
</head>
<body>
<%
String files=request.getParameter("files");
%>
<form name="form2" enctype="multipart/form-data" method="post" action="../MissionManage/commonfile.jsp?files=<%=files %>" onsubmit="return check();">
<center>
<table align="center" width="350" height="150" border="0" cellpadding="0" cellspacing="0"><!-- background="images/upFile_bg.gif -->
<tr>
<td valign="top"><table width="100%" height="145" border="0" cellpadding="0" cellspacing="0">
<tr>
<td height="49" colspan="2"></td>
</tr>
<tr>
<td width="9%" height="53"></td>
<td width="91%"><b>请选择上传的文件:</b><br>
<input id="file1" name="file1" type="file" size="35" onkeydown="return false;">
<br>
注:文件大小请控制在10M以内。</td>
</tr>
<tr>
<td colspan="2" align="center"><input name="Submit" type="submit" class="btn_grey" value="确认">

<input name="Submit2" type="button" class="btn_grey" onClick="window.close()" value="关闭"></td>
</tr>
</table></td>
</tr>
</table>
</center>
</form>
</body>
</html>

commonfile.jsp

<%@ page language="java" import="java.io.*" pageEncoding="UTF-8"%>
< import="java.util.*,org.apache.commons.fileupload.FileItem" %>
< import="java.text.SimpleDateFormat,java.util.Date" %>
< import="com.PoliceSystem.tools.FileOperate" %>
<jsp:useBean id="factory" scope="page" class="org.apache.commons.fileupload.disk.DiskFileItemFactory" />
<jsp:useBean id="upload" scope="page" class="org.apache.commons.fileupload.servlet.ServletFileUpload" />
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>上传文件</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<base target="_self">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" language="javascript">

</script>
</head>

<body>
<%
request.setCharacterEncoding("UTF-8");
String path1 = (String)request.getRealPath("/upload1");

String files=request.getParameter("files");
String[] fileList=files.split(";");

File file = new File(path1);

if(!file.exists()){
file.mkdirs();
}
factory.setRepository(file);
factory.setSizeThreshold(1024*1024);

upload.setFileItemFactory(factory);

try{
List<FileItem> list= upload.parseRequest(request);

for(FileItem item:list){
if(item.isFormField()){
//String value=item.getString("UTF-8");
//session.setAttribute("fileName", value);
}else{
String value=item.getName();
int start=value.lastIndexOf("\\");
String fileName=value.substring(start+1);
if(fileName.length() == 0 || fileName == ""){
out.println("<script>alert('上传失败');window.close();</script>");
}else{
if(item.getSize()>10000000){
out.println("<script>alert('对不起,您上传的文件超过10M,无法完成上传!');window.close();</script>");
}else{
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
Date date =new Date();
String[] f = item.getName().split("\\\\");
//System.out.println(f[f.length-1]);
String oldFileName = f[f.length-1];
for(int i=0;i<fileList.length;i++){
if(fileList[i].indexOf(oldFileName)!=-1){
out.println("<script>alert('对不起,您上传的文件与现有上传的文件重名,请更换文件名重新上传!');window.returnValue='';window.close();</script>");
}
}
String fType = FileOperate.getFileType(item.getName());//文件类型
fileName = sdf.format(date)+"."+fType;//新文件名
//System.out.println(item.getName()+"---"+fileName);
item.write(new java.io.File(path1,fileName));
//////--1--/////
String mailFileNames = new String();
String old = (String)session.getAttribute("fuJianFileNames");
if(old!=null){
mailFileNames = old;
}
mailFileNames+=oldFileName+"|"+fileName+";";
//System.out.println("mailFileNames="+mailFileNames);
session.removeAttribute("fuJianFileNames");
session.setAttribute("fuJianFileNames", mailFileNames);
//////--2--/////
//String pathName = path1+";
//System.out.println("pathName="+pathName);
out.println("<script>window.close();</script>");
}
}
}
}
}catch (Exception e) {
e.printStackTrace();
out.println("<script>window.close();</script>");
}
%>
</body>
</html>

插入文件数据到数据库中

public boolean insert_annex(String[] str){
boolean b=true;
String sql ="";
con = db.getConn();
try{
sql="insert into annex (querykey,sfilename,committime,Filetype,filepath,pno,Annex) values (?,?,?,?,?,?,?)";
ps = con.prepareStatement(sql);
for(int i=0;i<str.length-1;i++){
ps.setString(i+1, str[i]);
}
File file = new File(str[6]);//附件

InputStream iso = new FileInputStream(file);
ps.setBinaryStream(7, iso, iso.available());
ps.execute();
iso.close();
System.out.println("删除临时文件:" + file.delete());// 删除tmp文件
}catch(Exception e){
b=false;
e.printStackTrace();
}finally{
this.close();
}
return b;
}

读出文件数据,并保存

public boolean addTempFile_annex(String querykey,HttpServletRequest request){
boolean b=true;
con = db.getConn();
InputStream in = null;
OutputStream out= null;
String path1 = (String)request.getRealPath("/upload1");//文件下载临时目录
try{
String sql="select filePath,annex from annex where querykey='"+querykey+"'";
//String sql_1="select annex from annex where querykey='"+querykey+"'";

ps = con.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
File f = new File(path1+rs.getString("filepath"));
in=rs.getBinaryStream("annex");
out = new FileOutputStream(f);
int len = 10 * 100 * 100; //定义字符数组长度
byte[] P_Buf=new byte[len];
int j;
while((j=in.read(P_Buf))!=-1){
out.write(P_Buf, 0, j);
}
}
in.close();
out.flush(); //强制清出缓冲区
out.close();
}catch(Exception e){
b=false;
e.printStackTrace();
}finally{
this.close();
}
return b;
}

给定传递过来的参数(文件名,文件存储在服务器的文件名,文件在服务器的路径,文件类型),下载文件Action

package com.PoliceSystem.action.mail;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class downLoadFile extends ActionSupport{
private static final long serialVersionUID = -2207648627734251737L;

public String execute() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();

String fileminitype = request.getParameter("fileType");
String filename1 = new String(request.getParameter("fileName1").getBytes("ISO8859-1"),"UTF-8");
String filename2 = new String(request.getParameter("fileName2").getBytes("ISO8859-1"),"UTF-8");
String filepath = request.getRealPath("/upload1");
File f = new File(filepath+");
Long filelength = f.length();
int cacheTime = 10;

response.setContentType(fileminitype);
response.setHeader("Location",filename1);
response.setHeader("Cache-Control", "max-age=" + cacheTime);

response.setContentType("application/octet-stream");
byte[] b = filename1.getBytes("GBK");
filename1 = new String(b,"8859_1");
response.setHeader("Content-Disposition", "attachment;filename=" + filename1);
response.setContentLength(filelength.intValue());
OutputStream outputStream = response.getOutputStream();
InputStream inputStream = new FileInputStream(f);
byte[] buffer = new byte[1024];
int i = -1;
while ((i = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
}

outputStream.flush();
outputStream.close();
inputStream.close();

return null ;
}
}

② jsp中 input type=file 上传附件的实现原理

当一个form表单 被设置为enctype="MULTIPART/FORM-DATA" method="post" 时,其中的〈input type="file" name="filename" /> 标签如果被用户 选择了文件的话.
浏览器会把 文件内容连同 form的所有字段 格式化后传递到服务器~~
如下
一个测试:
<!--f.jsp-->
<%@ page contentType="text/html;charset=GB2312"%>
<HTML>
<BODY>
<p>选择要上传的文件:<BR>
<FORM action="accept.jsp" method="post" ENCTYPE="multipart/form-data">
<INPUT type=FILE name="boy" size="38">
<BR>
<INPUT type="hidden" id="tt" name="t" value="1">
<INPUT type="submit" id="gg" name="g" value="提交">
</BODY>
</HTML>

处理:
[color=green]
<!--accept.jsp-->
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page import="java.io.*"%>
<HTML>
<BODY>
<%try{InputStream in=request.getInputStream();
File f=new File("f:\\qin\\jsp","a.txt");
FileOutputStream o=new FileOutputStream(f);
byte b[]=new byte[1024];
int n;
while((n=in.read(b))!=-1)
{o.write(b,0,n);
}
o.close();
in.close();

}
catch(IOException ee){}
out.print("文件已经上传");
%>
</body>
</HTML>

③ qq传输文件原理是什么,

QQ是一个基于TCP/UDP协议的通讯软件,在 TCP/IP协议中,唯一标识一个应用进程的是socket,它通过网络层的IP地址和传输层的端口号来实现,对与同一个IP地址的内部网络,通过不同的端口号来标识不同的QQ进程;当你登陆QQ服务器的时候,服务器会保留你的保留IP地址和端口号信息,并在你的好友的QQ进程中进行列表显示,然后两个进程就可以通信了。
通常,发送文件的计算机首先要通过消息服务器将其IP地址发送给接收计算机,当接收计算机同意接收的确认消息反馈到消息服务器后,消息服务器将据此设置好文件传输对话。随即,发送计算机与接收计算机就会在确定好的端口范围内,建立起TCP或UDP连接开始文件的检索与传输。 在默认状态下,QQ优先采用了UDP(User Data Protocol,用户数据报协议)协议传送数据,而对可靠性要求高的数据通讯系统往往使用TCP协议传输数据。与TCP协议不同,UDP协议并不提供数据传送的验证机制——在整个文件传输过程中如果出现数据报的丢失,协议本身并不能作出任何的检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。 UDP协议适用于无须应答、要求时效的软件使用,这样的设计正好与QQ追求的目标相符,所以QQ优先使用了此协议进行一切功能应用。但是,由于UDP协议具有不可靠性,常会因种种原因导致消息或数据的发送失败(很多时候会发现发送文件给对方接收时,对方根本收不到要求接收文件的消息。或是发送聊天消息时,对方根本没有收到过消息)。显然,UDP协议由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。QQ在数据传输上更注重实际性能,为了获得更好的使用效果,往往可以牺牲一定的可靠性。

④ 大文件秒上传的原理是什么

不清楚,
我只能大致猜测一下,不要当真,也只是想想而已:
在互联网上有很多资源,
每个资源有各自的身份ID, 类似于MD5,或者HASH,
上传的时候,会看你的资源是否在网络上有相同的ID,
有的话,就从网络上获取,并存放在你的文件夹下,
速度几乎可以达到秒传,只是搜索了一个相同的链接而已,所以速度很快,
本地的哪个文件,可能压根就没传上去,
那个上传的资源其实并不正真在你的网盘里面而是一个类似于网络资源的链接,
可以把网络想象成一个巨大的文件服务器磁盘,
你从你 的电脑上传文件的时候,它会检索自己的磁盘是否有重复的文件,有就不会复制你的文件,
直接在自己的磁盘里面调用,
那没有的怎么办? 其实这个也好解决, 基本上我们的资源是取之于网用之于网,
网络上的资源可以想象成覆盖了哦我们本地99%的资源, 大部分都能在网上找到匹配的
只是想想而已,不必当真!
呵呵!!

⑤ 上传和下载文件的原理

《文件上传原理:Web上传文件的原理及实现》
下载了慢慢看吧:
www.crazycoder.cn/mypdf/1487.pdf

下载:掌握ftp传输协议就可以了。
HTTP:
GET ***
Content range: xxx-xxx
...
check for return code 200, 220, 3xx, 4xx, 5xx
FTP:
USER
PASS
SIZE
PORT
REST
RETR
QUIT
check for return codes of each command
多开几条连接,必要时还可以适当提高下载线程的优先级。断点续传对于HTTP一般是用Range字段实现、FTP一般用REST命令——当然,你的程序自身必须维护一个“已接收字节”之类的数据,用已提交这些请求。
去找些HTTP、FTP协议的资料,都有详细的讲解。

==========================================================
软件原理 。主要是用软件上传和下载的原理是怎样的?
这个很难用1,2句话说清楚,因为有IE下载,web下载,BT下载原理各不相同
你还是去看看相关的书吧

⑥ http文件上传的原理

HTTP 协议定义服务器端和客户端之间文件传输的沟通方式。目前HTTP协议的版本是Http1.1。RFC 2616描述了HTTP协议的具体信息。

这个协议已经成为浏览器和Web站点之间的标准。

当我上网的时候底层是如何进行交互的?

访问者点击一个超链接的时候,将会给浏览器提交一个URL地址。通过这个URL地址,浏览器便知道去链接那个网站并去取得具体的页面文件(也可能是一张图片,一个pdf文件)。

HTTP工作的基础就是,连接一个服务器并开始传输文件到浏览器。

HTTP传输的基本过程

在http传输的过程中,被称为客户端的请求者向服务器请求一个文件。

最基本的过程是:
1 客户端连接一个主机;
2 服务器接收连接,
3 客户端请求一个文件,
4 服务器发送一个应答.

⑦ http中上传文件的原理

http中上传文件的原理如下:
在最初的http协议中,没有上传文件方面的功能。 rfc1867 ( http://www.ietf.org/rfc/rfc1867.txt ) 为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端的网页程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。Microsoft IE, Mozila, Opera 已经支持此协议,在网页中使用一个特殊的 form 就可以发送文件。绝大部分 http server ,包括 tomcat ,已经支持此协议,可接受发送来的文件。各种网页程序,如 php, asp, jsp 中,对于上传文件已经做了很好的封装。

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。

⑧ 腾讯的文件秒传是什么原理为什么很大的文件一会儿就传完了,上传也很少的,怎么做到的

有一些文件,它先会对文件进行分析,然后把结果与服务器存储的文件的信息进行比较,如果是完全相同的,那么说明文件曾经上传过。(简单说就是腾讯服务器上有相同MD5的文件)所以它只需要在对方哪里给出一个指向服务器文件的链接,再下载就行了。如果每一个文件都完整上传上去,那么腾讯服务器负担就太大了。

⑨ 腾讯快速上传文件是什么原理,秒传

有一些文件,它先会对文件进行分析,然后把结果与服务器存储的文件的信息进行比较,如果是完全相同的,那么说明文件曾经上传过。(简单说就是腾讯服务器上有相同md5的文件)所以它只需要在对方哪里给出一个指向服务器文件的链接,再下载就行了。如果每一个文件都完整上传上去,那么腾讯服务器负担就太大了。

⑩ http文件上传的原理是什么请问向qq邮箱这类可以上传文件的网页,他们上传文件的原理是不是,当用

有个误区:
在上传插件中,用户点击提交(确认)后,文件才开始上传,这时候,会上传到服务器的某个目录(不是临时目录,一般是服务器按照管理用户文件的规则所建立的文件夹),服务器会返回一个指针,这个指针指向了你上传的文件。当你发送邮件后,邮件中也会包含这个指针。不管你把这个文件放到哪个文件夹,实际上都只是存放的这个指针而已。如非管理需要,这个文件应该会永久保存,任何转发,转储的行为,其实也只是操作的这个指针而不是文件本身。
即使你删除文件,也只是在你的文件夹中删除这个指针。所以,很多“极速秒传”实际上是先判断你要上传的文件的MD5值是否已经在服务器中存在,如果存在,就把已存在的文件的指针放上去,是不是很快?

热点内容
db2建表空间时怎么配置页大小 发布:2024-11-15 17:58:45 浏览:424
我的世界好玩地铁服务器 发布:2024-11-15 17:48:54 浏览:359
1710小游戏服务器ip 发布:2024-11-15 17:48:01 浏览:663
狂三脚本 发布:2024-11-15 17:31:38 浏览:872
附近存储柜 发布:2024-11-15 17:15:17 浏览:452
王选解决汉字存储问题 发布:2024-11-15 17:15:11 浏览:660
球球大作战安卓为什么不能玩哪些模式 发布:2024-11-15 17:14:26 浏览:996
存储器讲课 发布:2024-11-15 17:14:12 浏览:196
安卓充电头怎么称呼 发布:2024-11-15 17:11:17 浏览:446
猎人手游源码 发布:2024-11-15 17:09:28 浏览:433