⑴ 在線製作圖片的原理是..
就是你選擇本地一張圖片上傳或是在在線製作網站裡面找一張素材進行編輯即可
⑵ asp上傳圖片原理(不要代碼)只求論理
asp無組件上傳的原理
一、無組件上傳的原理
我還是一點一點用一個實例來說明的吧,客戶端HTML如下。要瀏覽上傳附件,我們通過<input type="file">元素,但是一定要注意必須設置form的enctype屬性為"multipart/form-data":
<form method="post" action="upload.asp" enctype="multipart/form-data">
<label>
<input type="file" name="file1" />
</label>
<br />
<input type="text" name="filename" value="default filename"/>
<br />
<input type="submit" value="Submit"/>
<input type="reset" value="Reset"/>
</form>
在後台asp程序中,以前獲取表單提交的ASCII 數據,非常的容易。但是如果需要獲取上傳的文件,就必須使用Request對象的BinaryRead方法來讀取。BinaryRead方法是對當前輸入流進行指定位元組數的二進制讀取,有點需要注意的是,一旦使用BinaryRead 方法後,再也不能使用Request.Form 或 Request.QueryString 集合了。結合Request對象的TotalBytes屬性,可以將所有表單提交的數據全部變成二進制,不過這些數據都是經過編碼的。首先讓我們來看看這些數據是如何編碼的,有無什麼規律可循,編段代碼,在代碼中我們將BinaryRead讀取的二進制轉化為文本,輸出出來,在後台的upload.asp中(注意該示例不要上傳大文件,否則可能會造成瀏覽器死掉):
<%
Dim biData, PostData
Size = Request.TotalBytes
biData = Request.BinaryRead(Size)
PostData = BinaryToString(biData,Size)
Response.Write "<pre>" & PostData & "</pre>" '使用pre,原樣輸出格式
' 藉助RecordSet將二進制流轉化成文本
Function BinaryToString(biData,Size)
Const adLongVarChar = 201
Set RS = createObject("ADODB.Recordset")
RS.Fields.Append "mBinary", adLongVarChar, Size
RS.Open
RS.AddNew
RS("mBinary").AppendChunk(biData)
RS.update
BinaryToString = RS("mBinary").Value
RS.Close
End Function
%>
簡單起見,上傳一個最簡單的文本文件(G:\homepage.txt,內容為"寶玉:http://www.webuc.net")來試驗一下,文本框filename中保留默認值"default filename",提交看看輸出結果:
-----------------------------7d429871607fe
Content-Disposition: form-data; name="file1"; filename="G:\homepage.txt"
Content-Type: text/plain
寶玉:http://www.webuc.net
-----------------------------7d429871607fe
Content-Disposition: form-data; name="filename"
default filename
-----------------------------7d429871607fe--
可以看出來對於表單中的項目,是用過"-----------------------------7d429871607fe"這樣的邊界來分隔成一塊一塊的,每一塊的開始都有一些描述信息,例如:Content-Disposition: form-data; name="filename",在描述信息中,通過name="filename"可以知道表單項的name。如果有filename="G:\homepage.txt"這樣的內容,說明是一個上傳的文件,如果是一個上傳的文件,那麼描述信息會多一行Content-Type: text/plain來描述文件的Content-Type。描述信息和主體信息之間是通過換行來分隔的。
嗯,基本上清晰了,根據這個規律我們就知道該怎麼來分離數據,再對分離的數據進行處理了,不過差點忽略一個問題,就是邊界值(上例中的"-----------------------------7d429871607fe")是怎麼知道的?每次上傳這個邊界值是不一樣的,還好還好asp中可以通過Request.ServerVariables( "HTTP_CONTENT_TYPE")來獲之,例如上例中HTTP_CONTENT_TYPE內容為:"multipart/form-data; boundary=---------------------------7d429871607fe",有了這個,我們不僅可以判斷客戶端的form中有無使用enctype="multipart/form-data"(如果沒有使用,那麼下面就沒必要執行啦),還可以獲取邊界值boundary=---------------------------7d429871607fe。(注意:這里獲取的邊界值比上面的邊界值開頭要少"--",最好補充上。)
至於如何分析數據的過程我就不多贅述了,無非就是藉助InStr,Mid等這樣的函數來分離出來我們想要的數據。
二、分塊上傳,記錄進度
要實時反映進度條,實質就是要實時知道當前伺服器獲取了多少數據?再回想一下我們實現上傳的過程,我們是通過Request.BinaryRead(Request.TotalBytes)來實現的,在Request的過程中我們無法得知當前伺服器獲取了多少數據。所以只能通過變通的方法了,如果我們可以將獲取的數據分成一塊一塊的,然後根據已經上傳的塊數我們就可以算出來當前上傳了多大了!也就是說,如果我1K為1塊,那麼上傳1MB的輸入流就分成1024塊來獲取,例如我當前已經獲取了100塊,那麼就表明當前上傳了100K。當我提出分塊的時候很多人覺得不可思議,因為他們都忽略BinaryRead方法不僅是可以讀取指定大小,而且可以連續讀取的。
寫個例子來驗證一下分塊讀取的完整性,在剛才的例子基礎上(注意該示例不要上傳大文件,否則可能會造成瀏覽器死掉):
<%
Dim biData, PostData, TotalBytes, ChunkBytes
ChunkBytes = 1 * 1024 ' 分塊大小為1K
TotalBytes = Request.TotalBytes ' 總大小
PostData = "" ' 轉化為文本類型後的數據
ReadedBytes = 0 ' 初始化為0
' 分塊讀取
Do While ReadedBytes < TotalBytes
biData = Request.BinaryRead(ChunkBytes) ' 當前塊
PostData = PostData & BinaryToString(biData,ChunkBytes) ' 將當前塊轉化為文本並拼接
ReadedBytes = ReadedBytes + ChunkBytes ' 記錄已讀大小
If ReadedBytes > TotalBytes Then ReadedBytes = TotalBytes
Loop
Response.Write "<pre>" & PostData & "</pre>" ' 使用pre,原樣輸出格式
' 將二進制流轉化成文本
Function BinaryToString(biData,Size)
Const adLongVarChar = 201
Set RS = createObject("ADODB.Recordset")
RS.Fields.Append "mBinary", adLongVarChar, Size
RS.Open
RS.AddNew
RS("mBinary").AppendChunk(biData)
RS.update
BinaryToString = RS("mBinary").Value
RS.Close
End Function
%>
試驗一下上傳剛才的文本文件,輸出結果證明這樣分塊讀取的內容是完整的,並且在While循環中,我們可以在每次循環時將當前狀態記錄到Application中,然後我們就可以通過訪問該Application動態獲取上傳進度條。
另:上例中是通過字元串拼接的,如果是要拼接二進制數據,可以通過ADODB.Stream對象的Write方法,示例代碼如下:
Set bSourceData = createobject("ADODB.Stream")
bSourceData.Open
bSourceData.Type = 1 'Binary
Do While ReadedBytes < TotalBytes
biData = Request.BinaryRead(ChunkBytes)
bSourceData.Write biData ' 直接使用write方法將當前文件流寫入bSourceData中
ReadedBytes = ReadedBytes + ChunkBytes
If ReadedBytes > TotalBytes Then ReadedBytes = TotalBytes
Application("ReadedBytes") = ReadedBytes
Loop
三、保存上傳的文件
通過Request.BinaryRead獲取提交數據,分離出上傳文件後,根據數據類型的不同,保存方式也不同:
對於二進制數據,可以直接通過ADODB.Stream對象的SaveToFile方法,將二進制流保存成為文件。
對於文本數據,可以通過TextStream對象的Write方法,將文本數據保存到文件中。
對於文本數據和二進制數據,是可以方便的相互轉換的,對於上傳小文件來說,兩者基本上沒什麼差別。但是兩種方式保存時還是有一些差別的,對於ADODB.Stream對象,必須將所有數據全部裝載完才可以保存成文件,所以使用這種方式如果上傳大文件將很佔用內存,而對於TextStream對象,可以在文件創建好後,一次Write一部分,分多次Write,這樣的好處是不會佔用伺服器內存空間,結合上面分析的分塊獲取數據原理,我們可以每獲取一塊上傳數據就將之Write到文件中。我曾做過試驗,同樣本機上傳一個200多MB的文件,使用第一種方式內存一直在漲,到最後直接提示計算機虛擬內存不足,最可恨是即使進度條表示文件已經上傳完,但是最終文件還是沒有保存上。而使用後一種方法,上傳過程中內存基本上無什麼變化。
四、未解決的難題
我在博客園上看到Bestcomy描述他的Asp.Net上傳組件是可以和Sever.SetTimeOut無關的,而在Asp中我是沒能做到,對於上傳大文件,就只有將Server.SetTimeOut設置為一個很大的值才可以。不知道有沒有比較好的解決方法。
如果我們在保存文件時,使用TextStream對象的Write方法,那麼如果用戶上傳時中斷了文件傳輸,已經上傳的那部分文件還是在的,如果可以斷點續傳就好了。關鍵問題是Request.BinaryRead方法雖然可以分塊讀取,但是卻不能跳過某一段讀取!
⑶ 想了解照片能被上傳到網路相冊的原理
很簡單啊,不知道你是不是開發人員,只是通過網路的文件傳輸協議把照片轉化成數據一點一點的發送到網路相冊伺服器,在網路伺服器全部接收到數據後就會組成照片啦,你在通過http協議就可以在網路上訪問啦。。。
⑷ 百度圖片搜索引擎原理是如何實現的
圖片搜索的原理有三個步驟
1. 將目標圖片進行特徵提取,描述圖像的演算法很多,用的比較多的是:SIFT描述子,指紋演算法函數,bundling features演算法,hash function(散列函數)等。也可以根據不同的圖像,設計不同的演算法,比如圖像局部N階矩的方法提取圖像特徵。
2. 將圖像特徵信息進行編碼,並將海量圖像編碼做查找表。對於目標圖像,可以對解析度較大的圖像進行降采樣,減少運算量後在進行圖像特徵提取和編碼處理。
3. 相似度匹配運算:利用目標圖像的編碼值,在圖像搜索引擎中的圖像資料庫進行全局或是局部的相似度計算;根據所需要的魯棒性,設定閾值,然後將相似度高的圖片預保留下來;最後應該還有一步篩選最佳匹配圖片,這個應該還是用到特徵檢測演算法。
其中每個步驟都有很多演算法研究,圍繞數學,統計學,圖像編碼,信號處理等理論進行研究。
根據Neal Krawetz博士的解釋,原理非常簡單易懂。我們可以用一個快速演算法,就達到基本的效果。
這里的關鍵技術叫做"感知哈希演算法"(Perceptual hash algorithm),它的作用是對每張圖片生成一個"指紋"(fingerprint)字元串,然後比較不同圖片的指紋。結果越接近,就說明圖片越相似。下面是一個最簡單的實現:
第一步,縮小尺寸。
將圖片縮小到8x8的尺寸,總共64個像素。這一步的作用是去除圖片的細節,只保留結構、明暗等基本信息,摒棄不同尺寸、比例帶來的圖片差異。
第二步,簡化色彩。
將縮小後的圖片,轉為64級灰度。也就是說,所有像素點總共只有64種顏色。
第三步,計算平均值。
計算所有64個像素的灰度平均值。
第四步,比較像素的灰度。
將每個像素的灰度,與平均值進行比較。大於或等於平均值,記為1;小於平均值,記為0。
第五步,計算哈希值。
將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序並不重要,只要保證所有圖片都採用同樣次序就行了。
得到指紋以後,就可以對比不同的圖片,看看64位中有多少位是不一樣的。在理論上,這等同於計算"漢明距離"(Hammingdistance)。如果不相同的數據位不超過5,就說明兩張圖片很相似;如果大於10,就說明這是兩張不同的圖片。
具體的代碼實現,可以參見Wote用python語言寫的imgHash.py。代碼很短,只有53行。使用的時候,第一個參數是基準圖片,第二個參數是用來比較的其他圖片所在的目錄,返回結果是兩張圖片之間不相同的數據位數量(漢明距離)。
這種演算法的優點是簡單快速,不受圖片大小縮放的影響,缺點是圖片的內容不能變更。如果在圖片上加幾個文字,它就認不出來了。所以,它的最佳用途是根據縮略圖,找出原圖。
實際應用中,往往採用更強大的pHash演算法和SIFT演算法,它們能夠識別圖片的變形。只要變形程度不超過25%,它們就能匹配原圖。這些演算法雖然更復雜,但是原理與上面的簡便演算法是一樣的,就是先將圖片轉化成Hash字元串,然後再進行比較。
⑸ 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超文本傳輸協議標准架構的發展根基。
⑺ 按照網路上傳送照片的原理,要在網路上傳送氣味,還需要具備那些條件
把手機上的東西往網路上傳的最好方法是先傳到電腦上,然後在傳到電子郵箱,不但方便快捷,而且不用錢哦,用手機傳的話不但有時因網路狀況不好而傳送失敗,而且gprs流量的費用很高,1kb3分錢。
⑻ QQ發送圖片的原理是什麼
是將圖片轉換成二進制,然後在發送
⑼ 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下載原理各不相同
你還是去看看相關的書吧
⑽ 前端,js實現圖片上傳的原理是設么能回答面試即可
H5的話,就是把本地的圖片按照指定的格式讀取到緩存里,再供JS代碼進行調用傳給後台,格式的話base64吧