① java上傳文件後用戶是如何訪問的(java實現文件上傳的三種方式)
JAVA把文件傳到伺服器.......文件上傳到A以後放到伺服器上面然後他就有一個絕對的訪問路徑也就是對應一個絕對的url這樣就好辦了
Java提供了對URL訪問和大量的流操作的的API,可以很容易的完成對網路上資源的存取,下面的代碼段就完成了對一個網站的資源進行訪問:
......
destUrl="";
//假設你把文件放到webroot底下的java文件裡面
url=newURL(destUrl);
httpUrl=(HttpURLConnection)url.openConnection();
//連接指定的網路資源
httpUrl.connect();
//獲取網路輸入流
bis=newBufferedInputStream(httpUrl.getInputStream());
......
得到流後下面你自己想怎麼操作就怎麼操作了
對於怎麼得到資源的連接地址這個方法很多你可以專門提供一個Servlet獲取到輸出的流後Response.write轉門提供伺服器已上傳的文件文件名可以一天位單位返回
客戶端用與上面同樣的方法得到文件名後拆分然後再繼續循環調用上面的方法下載文件就ok了
呵呵希望可以幫助到你
如何通過Java客戶端程序通過rest介面訪問並上傳文件(文檔)到web伺服器?圖片目錄不在項目路徑下,直接通過HTTP訪問不到,如果你硬是要這么訪問,你可以自己寫一個Servlet,通過流的方式輸出,注意要吧Content-Type設置正確
java上傳成功後怎麼觸發其他操作javaget方式非同步上傳_簡述Java非同步上傳文件的三種方式原創
2021-02-1316:31:03
yibbbian
碼齡4年
關注
本文為大家分享了三種Java非同步上傳文件方式,供大家參考,具體內容如下
用第三方控制項,如Flash,ActiveX等瀏覽器插件上傳。
使用隱藏的iframe模擬非同步上傳。
使用XMLHttpRequest2來實現非同步上傳。
第一種使用瀏覽器插件上傳,需要一定的底層編碼功底,在這里我就不講了,以免誤人子弟,提出這點大家可以自行網路。
第二種使用隱藏的iframe模擬非同步上傳。為什麼在這里說的是模擬呢?因為我們其實是將返回結果放在了一個隱藏的iframe中,所以才沒有使當前頁面跳轉,感覺就像是非同步操作一樣。
隱藏的iframe上傳文件
附件:
正在上傳...
//上傳完成後的回調
functionuploadFinished(fileName){
addToFlist(fileName);
loading(false);
}
functionaddToFlist(fname){
vartemp=["
",
fname,
"刪除",
"
"
];
$("#flist").append(temp.join(""));
}
functionloading(showloading){
if(showloading){
$("#uptxt").show();
}else{
$("#uptxt").hide;
}
}
這種技術有兩個關鍵的地方:
1.form會指定target,提交的結果定向返回到隱藏的ifram中。(即form的target與iframe的name屬性一致)。
2.提交完成後,iframe中頁面與主頁面通信,通知上傳結果及服務端文件信息
如何與主頁面通信呢?
我們用nodejs在接收完了文件後返回了一個window.parent.主頁面定義的方法,執行後可以得知文件上傳完成。代碼很簡單:
router.post('/upload2',multipartMiddleware,function(req,res){
varfpath=req.files.myfile.path;
varfname=fpath.substr(fpath.lastIndexOf('\')+1);
setTimeout(function{
varret=["
"window.parent.uploadFinished('"+fname+"');",
""];
res.send(ret.join(""));
},3000);
});
執行後可以打開開發人員選項,你會發現隱藏iframe中返回了伺服器的一些數據。
第三種使用XMLHttpRequest2來進行真正的非同步上傳。
還是先貼出代碼:
執行後可以打開開發人員選項,你會發現隱藏iframe中返回了伺服器的一些數據。第三種使用XMLHttpRequest2來進行真正的非同步上傳。還是先貼出代碼:
xhrlevel2非同步上傳
附件:
正在上傳...
停止上傳
functionupload{
//1.准備FormData
varfd=newFormData;
fd.append("myfile",$("#myfile")[0].files[0]);
//創建xhr對象
varxhr=newXMLHttpRequest;
//監聽狀態,實時響應
//xhr和xhr.upload都有progress事件,xhr.progress是下載進度,xhr.upload.progress是上傳進度
xhr.upload.onprogress=function(event){
if(event.lengthComputable){
varpercent=Math.round(event.loaded*100/event.total);
console.log('%d%',percent);
$("#upprog").text(percent);
}
};
//傳輸開始事件
xhr.onloadstart=function(event){
console.log('loadstart');
$("#upprog").text('開始上傳');
$("#stopbtn").one('click',function{xhr.abort;$(this).hide();});
loading(true);
};
//ajax過程成功完成事件
xhr.onload=function(event){
console.log('loadsuccess');
$("#upprog").text('上傳成功');
console.log(xhr.responseText);
varret=JSON.parse(xhr.responseText);
addToFlist(ret.fname);
};
//ajax過程發生錯誤事件
xhr.onerror=function(event){
console.log('error');
$("#upprog").text('發生錯誤');
};
//ajax被取消
xhr.onabort=function(event){
console.log('abort');
$("#upprog").text('操作被取消');
};
//loadend傳輸結束,不管成功失敗都會被觸發
xhr.onloadend=function(event){
console.log('loadend');
loading(false);
};
//發起ajax請求傳送數據
xhr.open('POST','/upload3',true);
xhr.send(fd);
}
functionaddToFlist(fname){
vartemp=["
",
fname,
"刪除",
"
"
];
$("#flist").append(temp.join(""));
}
functiondelFile(fname){
console.log('todeletefile:'+fname);
//TODO:請實現
}
functionloading(showloading){
if(showloading){
$("#uptxt").show();
$("#stopbtn").show();
}else{
$("#uptxt").hide();
$("#stopbtn").hide();
}
}
代碼有點多,但是通俗易懂。使用過AJAX的人都知道,XHR對象提供了一個onreadystatechange的回調方法來監聽整個請求/響應過程。在XMLHttpRequest2級規范中又多了幾個進度事件。有以下6個事件:
1.loadstart:在接收到響應數據的第一個位元組時觸發。
2.progress:在接收響應期間持續不斷地觸發。
3.error:在請求發生錯誤時觸發。
4.abort:在因為調用abort方法而終止連接時觸發。
5.load:在接收到完整的響應數據時觸發。
6.loadend:在通信完成或者觸發error,abort,load事件後觸發。
這次我們可以解讀代碼:當傳輸事件開始後,我們便在停止傳送按鈕上添加點擊事件,內置了abort方法可以停止傳送。若不點則會正常上傳直到傳送完畢為止。其後台代碼類似第二種方法。
三種方法各有優劣,做個簡單的小結吧。
第三方控制項交互性和可控性好,因為接近底層,其性能也是很優秀的。但是由於編寫難度大通常需要自己安裝插件,有時可能需要自己進行編寫。
隱藏的iframe方法我個人覺得是非常有思想的一個方法,iframe可以幫我們做很多事。這種方式具有廣泛的瀏覽器兼容性而且不需要安裝插件。但是它交互性差,上傳過程不可控,而且性能也是很一般的。
XHR2級的純ajax上傳,它必須要版本比較高一點的瀏覽器(ie9+)。但是它交互性特別好,可以看到上傳進度並且是可控的。
java如何訪問區域網共享文件?
java訪問共享文件夾,讀取區域網中一台機器的共享目錄中的文件,需要jcifs-1.1.11.jar的支持,使用SMB協議,以下是實現了遠程讀取文件的功能代碼:
package?junit;
import?jcifs.smb.SmbFile;
/**???
?*?java訪問區域網共享目錄
?*
?*?@author?administrator
?*?@version?1.0?2015-7-6?
?*/
public?class?SmbTest?{
????public?static?void?main(String[]?args)?throws?Exception?{
????????//smb://xxx:[email protected]/testIndex/??
????????//xxx:xxx是共享機器的用戶名密碼
????????String?url="smb://192.168.2.188/testIndex/";
????????SmbFile?file?=?new?SmbFile(url);
????????if(file.exists()){
????????????SmbFile[]?files?=?file.listFiles();
????????????for(SmbFile?f?:?files){
????????????????System.out.println(f.getName());
????????????}
????????}
????}
}
java文件上傳後,一般怎麼和用戶掛鉤呢?第一個問題,如果有單獨的文件伺服器,上傳的每一個文件有一個唯一的id,{id,filePath},id與用戶關聯即可.
第二個問題,可以一組文件分配一個id,表示這些文件是一個組的,id與用戶關聯.
② sublime怎麼自動生成代碼
1、首先要熟悉sublime api,插件可以用python開發,這個很好,寫好代碼,保存到默認的目錄應該是\SublimeText2\Data\Packages\User下面,
可以按下快捷鍵Ctrl + 『 打開SublimeText的控制台,執行如下命令就可以運行剛剛寫的小插件,測試效果:
Java代碼
view.run_command('insert_signature')
2、為了方便使用需要綁定快捷鍵,在同目錄下\SublimeText2\Data\Packages\User 有快捷鍵文件 Default (操作系統類型).sublime-keymap 3個類似的文件,修改綁定快捷鍵即可,如下:
自動生成代碼頭 代碼如下:
Java代碼
#coding=gbk
'''
Created on -- ::
@author: songpo
'''
#view.run_command('insert_codeheader')
import sublime, sublime_plugin, datetime
class insertSignatureCommand(sublime_plugin.TextCommand):
def run(self, edit):
date = datetime.datetime.now()
dateStr = date.strftime("%Y-%m-%d %X")
text_encode = """#-*- encoding: utf- -*-\n'''\n"""
text_author = """\n\n@author: songpo\n'''\n"""
text = text_encode + 'Created on ' + dateStr + text_author
#for region in the selection
#一個region是一個選擇塊,一次可以選擇多個塊
for r in self.view.sel():
str_r = self.view.substr(r)#str_r是所選擇塊的文本內容
if 'Created on ' in str_r:
if 'Updated on ' in str_r:
text = str_r[:str_r.find('Updated on')] + 'Updated on ' + dateStr + text_author
else:
text = str_r.replace(text_author, '\nUpdated on' + dateStr + text_author)
self.view.erase(edit, r)
self.view.insert(edit, r.begin(), text)
參考博客:http://www.cnblogs.com/restran/archive/2013/01/07/2850254.html
1、自定義快捷鍵:
sublime的操作體驗完全基於配置,如有你願意多調整,完全可以按照自己的意願重新定義一個操作體驗,有2個快捷鍵配置文件系統和用戶,應該是用戶的
可以覆蓋系統的,在preferences-按鍵綁定-系統/用戶
即可打開配置。小試一下增加一個eclipse的功能,就是上下調整選中行,添加如下代碼:
Java代碼
{ "keys": ["alt+up"], "command": "swap_line_up"},
{ "keys": ["alt+down"], "command": "swap_line_down"},
2、Sublime Text 2 的快捷鍵還支持雙重組合,譬如默認情況下,將選中的文字改成大寫的熱鍵是「Ctrl+K,
Ctrl+U」,意思是當你先按下 Ctrl+K 之後迅速再按 Ctrl+U
進行觸發(只按下Ctrl+K是沒有作用的),這樣可以避免很多熱鍵沖突,也可以更靈活更多選擇地進行熱鍵自定義
3、常用快捷鍵:
Shift+滑鼠右鍵 (Win) 或 Option+滑鼠左鍵 (Mac) 或使用滑鼠中鍵可以用滑鼠進行豎向多行選擇
ctrl+p:雷電般快速的文件切換:
Ctrl+P(Win),這次試試先輸入一個 @ 號:隨心所欲的跳轉:快速羅列與定位函數/HTML的元素、跳轉到指定行
更牛x的了來了,這些切換定位方法你還可以配合在一起使用!譬如我有一個名為」hello-iplaysoft.js」的文件,裡面其中有一個
function叫做」visit_iplaysoft_com」,我現在想要編輯這個函數,那麼我只需按下
Ctrl+P,然後輸入「heip@vi」回車(模糊匹配,注意前面有顏色的字元),ST2
馬上就給我到打開這個文件並定位進去了!夠方便了吧?!熟記這幾個快捷鍵,你可以很一氣呵成地進行文件切換和編輯
------------------------------------
------------一下是mac版本配置--------------
------------------------------------
看考地址:https://wido.me/sunteya/sublime-text-packages-and-settings/
1、Sublime Text 常用插件和設置
打開 Sublime Text 2 後, 可以在菜單中找到 Preferences -> Settings - User 點擊後, 會打開一個編輯器窗口. 在該編輯器窗口下, 就可以輸入當前用戶的關配置了. 我一般配置如下:
Java代碼
{
"color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",
"dictionary": "Packages/Language - English/en_GB.dic",
"font_size": 11.0,
"draw_white_space": "all",// 顯示空白字元, 比如 空格 tab
"font_size": 13.0,
"scroll_past_end": true,// 當文件到末尾時還能繼續滾動
"trim_automatic_white_space": false, // 關閉自動刪除每行前後空格
"ignored_packages":
[
"Vintage"
]
}
2、Package Control 下載插件(格式化xml)
Package Control 是用來管理 Sublime Text 2 的插件的插件. 也是裝完後第一個要安裝的插件.
首先打開 ctrl+`, 並在打開的 st2 console 中輸入:
Java代碼
import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'
安裝完成後, 應該就可以看到菜單下有 Preferences -> Package Settings 選項了.
常用插件
上面的 Package Control 安裝完以後, 就可以通過快捷鍵 command + shift + p 並輸入 install package, 來選擇需要安裝的插件.
Alignment
這插件用於對齊代碼賦值語句, 例如:
var name = "sublimt"
var version = "2.0.1"
var title = "sublime text"
按下快捷鍵後, 會變成:
var name = "sublimt"
var version = "2.0.1"
var title = "sublime text"
不過這插件默認使用的是 ctrl + cmd + a 和 那個搶了 5個全局個快捷鍵的QQ沖突, 所以需要修改插件的快捷鍵. 點擊菜單 Preferences -> KeyBindings - User, 加入如下內容
{ "keys": ["super+ctrl+alt+]"], "command": "alignment" }
將快捷鍵修改成 ctrl + opt + cmd + ], 要改成什麼其他的也請自行修改.
Vim 模式
是的,Sublime Text 2 dev 版已經支持 Vim 的編輯模式了,如果更喜歡 Vim 的編輯模式,可以通過以下方法來激活 Vintage mode:
按下 Shift + Command + P 調出命令面板。
輸入 settings user 調出 Preferences:Settings - User,並按下回車。
以上兩步也可以直接用cmd + ,完成。
這時會打開一個 Preferences.sublime-settings 的文件,如果是第一次修改,它應該是個空文件,把以下文本粘貼進去:
Java代碼
{
"ignored_packages": []
}
保存這個文件,這時按下 ESC 鍵,再按下一些你熟悉的 Vim 命令,是不是很有親切感
③ 易語言的API裡面的GetMoleFileNameA,怎麼使用
GetMoleFileNameA是獲取一個DLL模塊的路徑
需要使用GetMoleHandleA,參數一為DLL的函數名或函數地址,這個函數來得到模塊句柄
如果是已知窗口句柄欲獲取窗口所在的進程可使用以下代碼(獲取窗口所在進程ID,然後通過進程ID獲取該程序的路徑):
GetWindowThreadProcessId,取窗口進程ID
.子程序 取進程路徑, 文本型, 公開, 取指定進程的程序啟動路徑(成功返迴路徑,失敗或進程不存在返回空)
.參數 進程ID, 整數型
.局部變數 快照句柄, 整數型
.局部變數 模塊信息, 模塊信息型
.局部變數 路徑, 文本型
快照句柄 = _創建快照 (8, 進程ID)
.如果真 (快照句柄 = -1)
返回 (「」)
.如果真結束
模塊信息.size = 1024
_第一個模塊 (快照句柄, 模塊信息)
路徑 = 到文本 (模塊信息.模塊完整路徑)
_關閉對象 (快照句柄)
返回 (路徑)
.DLL命令 _創建快照, 整數型, , "CreateToolhelp32Snapshot"
.參數 falg, 整數型
.參數 id, 整數型
.DLL命令 _第一個模塊, 整數型, , "Mole32First", , 第一個模塊,查找模塊
.參數 快照句柄, 整數型
.參數 模塊信息, 模塊信息型
.DLL命令 _關閉對象, 整數型, , "CloseHandle", 公開, kernel32.dll
.參數 對象句柄, 整數型
.數據類型 模塊信息型, 公開, 進程模塊信息
.成員 size, 整數型
.成員 mid, 整數型
.成員 pid, 整數型
.成員 gusage, 整數型
.成員 pusage, 整數型
.成員 base, 整數型
.成員 大小, 整數型
.成員 模塊句柄, 整數型
.成員 模塊文件名, 位元組型, , "256"
.成員 模塊完整路徑, 位元組型, , "256"