自己編寫JAVA環境下的檔案上傳元件 (轉)
自己編寫環境下的
上傳檔案是經常用到的,B/S環境下的檔案上傳原理其實和帶附件的E一樣,HTTP資料流
由標誌性的資料加上檔案資料組成,你只要得到資料流將其標誌性資料去掉,剩下的就是你
的資料檔案了,在將其寫成檔案就完成了上傳。
下面我們分佈說明:
1.上傳檔案的靜態頁面,我們一定要確認method="post" enctype="multipart/form-data"
為什麼就不要說了吧。
test2
客戶端上傳後,端的資料流頭尾部格式如下,這裡上傳了一個文件
我們看看資料流的頭部:
-----------------------------7d22f821706e0Content-Disposition: form-data;
name="filea"; filename="C:工作流管理總體設計.doc"Content-Type:
application/msword
邢唷??...... (注意這裡是資料檔案開始的地方)
....................................
尾部標誌:
-----------------------------7d22f821706e0Content-Disposition: form-data;
name="btnval"
上載-----------------------------7d22f821706e0--
所以去掉頭尾部標誌性資料我們就得到上傳的檔案資料了。
下面我們看看處理上傳的Bean:uploaean 首先得到初始化Bean得到上下文環境:
public final void initialize(PageContext pageContext)
throws Exception
{
m_application = pageContext.getServletContext();
m_request = (HttpServletRequest)pageContext.getRequest();
m_response = (HttpServletResponse)pageContext.getResponse();
}
將資料流寫到一個BYTES陣列中,陣列大小就是REQUEST流的大小。
m_totalBytes = m_request.getContentLength();
m_binArray = new byte[m_totalBytes];
for(; totalRead < m_totalBytes; totalRead += readBytes)
try
{
m_request.getInputStream();
readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);
}
catch(Exception e)
{
System.out.println(" Unable to upload data .");
e.printStackTrace();
}
2。下面就開始處理BYTES陣列
以前我見到有網友的作法將m_binArray直接轉化成String,然後利用String的方法去掉標誌
位資料
String newstr=new String(m_binArray);
這一方法我試過了,是行不通的,我不知道它們測試過沒有,對於上傳文字檔案應該沒問題
如果上傳的是WORD文件或者圖片等二進位制檔案,進行轉化成字串的時候資料就會有丟失,我想
可能是因為編碼的原因造成的,所以不能直接轉換。
正確的方法是將位元組陣列的每一位轉化成CHAR或判斷ASCII碼值來判斷頭尾標誌為資料:
for(; !found && m_currentIndex < m_totalBytes; m_currentIndex++)
{
if(m_binArray[m_currentIndex] == 13)
found = true;
else
m_boundary = m_boundary + (char)m_binArray[m_currentIndex];
}
if(m_currentIndex == 1)
return;
m_currentIndex++;
do
{
if(m_currentIndex >= m_totalBytes)
break;
dataHeader = getDataHeader();
System.out.println(dataHeader);
m_currentIndex = m_currentIndex + 2;
iile = dataHeader.indexOf("filename") > 0;
getDataSection();
if(isFile)
{
////
System.out.println("----->m_startData:"+m_startData);
System.out.println("----->m_endData:"+m_endData);
try
{
fileout = new FileOutputStream("c:test11.doc");
fileout.write(m_binArray,m_startData,m_endData-m_startData+1);
fileout2 = new FileOutputStream("c:test00.doc");
fileout2.write(m_binArray);
}
catch(Exception e)
{
System.out.println(" Unable to write data to test file .");
e.printStackTrace();
}
finally
{
try
{
fileout.close();
fileout2.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
private String getDataHeader()
{
int start = m_currentIndex;
int end = 0;
int len = 0;
boolean found = false;
while(!found)
if(m_binArray[m_currentIndex] == 13 && m_binArray[m_currentIndex + 2] == 13)
{
found = true;
end = m_currentIndex - 1;
m_currentIndex = m_currentIndex + 2;
}
else
{
m_currentIndex++;
}
String dataHeader = new String(m_binArray, start, (end - start) + 1);
return dataHeader;
}
private void getDataSection()
{
boolean found = false;
String dataHeader = new String();
int searchP= m_currentIndex;
int keyPos = 0;
int boundaryLen = m_boundary.length();
m_startData = m_currentIndex;
m_endData = 0;
do
{
if(searchPos >= m_totalBytes)
break;
if(m_binArray[searchPos] == (byte)m_boundary.charAt(keyPos))
{
if(keyPos == boundaryLen - 1)
{
m_endData = ((searchPos - boundaryLen) + 1) - 3;
break;
}
searchPos++;
keyPos++;
}
else
{
searchPos++;
keyPos = 0;
}
}
while(true);
m_currentIndex = m_endData + boundaryLen + 3;
}
m_currentIndex為當前位元組陣列的指標位置,先得到HEADER資料,見方法getDataHeader()
然後在得到檔案資料開始的指標位置和SIZE,見方法getDataSection()
然後,將資料流寫到檔案裡:
fileout.write(m_binArray,m_startData,m_endData-m_startData+1);
就得到了完整的資料檔案,上面test00.doc 和 test11.doc 是去掉標誌資料前後的資料流
分別寫成的檔案,大家用二進位制檢視程式可看出其中的差別。
以上getDataHeader(),getDataSection()是我參考了SMARTUPLOAD的實現原理,
其中分析標誌資料位的方法稍有複雜,網友可自己去分析。程式在下測試透過,
上傳WORD文件和圖片都沒問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993450/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 寫給自己的分塊上傳檔案
- Java環境下載、配置環境、編寫我的第一個Java程式Java
- JAVA檔案上傳下載Java
- Angular元件-檔案上傳元件Angular元件
- java上傳檔案跟批量下載檔案Java
- Docker下Java檔案上傳服務三部曲之一:準備環境DockerJava
- 寫在開始編寫Java之前(2)——Java的環境Java
- java 上傳 下載檔案工具類Java
- java實現sftp檔案的上傳下載JavaFTP
- 裝置元件檔案轉換為EVE-NG環境的支援元件元件
- [Vue]寫一個簡單的檔案上傳控制元件Vue控制元件
- 用Java編寫ASP元件 (轉)Java元件
- Java SE 檔案上傳和檔案下載的底層原理Java
- java編譯環境的構建(轉)Java編譯
- 利用Java編寫HTML檔案分析程式(轉)JavaHTML
- 建立自己的上傳元件的程式設計思路 (轉)元件程式設計
- 關於檔案上傳下載的編碼問題
- 也談一下檔案上傳 (轉)
- JavaWeb之實現檔案上傳與下載元件JavaWeb元件
- 如何在伺服器環境中上傳下載檔案伺服器
- JAVA Web 之 struts2檔案上傳下載演示(一)(轉)JavaWeb
- 檔案上傳下載
- Java Web 檔案上傳JavaWeb
- java寫檔案(轉)Java
- Java Struts檔案上傳和下載詳解Java
- 檔案的上傳與下載
- Java 中的 GraphQL 上傳檔案Java
- python寫的FTP簡單上傳下載檔案薦PythonFTP
- linux環境下使用XFS檔案系統(轉)Linux
- 自己動手用c#寫控制元件(上) (轉)C#控制元件
- 在jsp中使用smartupload元件上傳檔案 (轉)JS元件
- 打造自己的 Python 編碼環境Python
- 用Delphi編寫點對點傳檔案程式(1) (轉)
- 用Delphi編寫點對點傳檔案程式(2) (轉)
- 檔案上傳與下載
- Vertx 檔案上傳下載
- centos上傳下載檔案CentOS
- Java如何上傳大檔案Java