當前位置:首頁 » 文件傳輸 » 文件上傳原理
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

文件上傳原理

發布時間: 2022-03-05 20:51:18

Ⅰ 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超文本傳輸協議標准架構的發展根基。

Ⅱ 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在數據傳輸上更注重實際性能,為了獲得更好的使用效果,往往可以犧牲一定的可靠性。

Ⅲ JSP中文件上傳的原理

ying應該就是文件輸入輸出流的運用吧·

Ⅳ 文件上傳的基本原理,用文字詳細說明一下

我藉助別人的資料,感覺挺詳細,仔細研究一下吧
中文件上傳與下載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 ;
}
}

Ⅳ C#上傳文件的原理

《文件上傳原理:Web上傳文件的原理及實現》
下載了慢慢看吧:

下載:掌握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 伺服器發送一個應答.

Ⅶ 上傳和下載文件的原理

《文件上傳原理: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下載原理各不相同
你還是去看看相關的書吧

Ⅷ 文件上傳時,進度條的設計原理是什麼

以java為例:一般來說,上傳也好,下載也好,都要用到JavaI/O。 而計算進度的原理,不就是已經傳輸的大小與總大小的比值嘛。 這樣就簡單了,就拿最基本的OutputStream來說,它的基本的寫出方法為 void write(byte[] b) ,實際上寫出的過程不就是通過InputStream循環讀,然後OutputStream循環寫嘛。 你只要事先通過File類取得文件的總大小,然後在讀入或寫出的循環里加一個簡單的進度計算的步驟,每讀取或寫出一次,就將已傳輸大小增加b.length,求出比值,更新進度條。具體的計算間隔,可以根據循環次數或時間間隔來定。 編碼上,估計要用到I/O流,File,Socket以及Thread。 因為你是使用fileupload插件,所以最好查看一下它的實現代碼,已決定如何將進度功能加入其中。

Ⅸ 騰訊的文件秒傳是什麼原理為什麼很大的文件一會兒就傳完了,上傳也很少的,怎麼做到的

有一些文件,它先會對文件進行分析,然後把結果與伺服器存儲的文件的信息進行比較,如果是完全相同的,那麼說明文件曾經上傳過。(簡單說就是騰訊伺服器上有相同MD5的文件)所以它只需要在對方哪裡給出一個指向伺服器文件的鏈接,再下載就行了。如果每一個文件都完整上傳上去,那麼騰訊伺服器負擔就太大了。