靜態資源分離就是把靜態資源放到另外一臺服務器上,web服務器只發布web項目
配置啓動靜態資源服務,讓資源文件經過http方式可訪問,
常見方案是使用nginx或者apache設置映射,這樣就能經過瀏覽器訪問到 Linux服務器中的文件
java 實現上傳文件到遠程服務器經常使用方案:
java上傳文件到ftp服務器(這個方案須要在靜態資源服務器安裝ftp服務)
java使用HttpURLConnection上傳文件到遠程服務器 (分爲客戶端和服務端,客戶端負責上傳,服務端負責接收文件)
java使用HttpClient經過Post上傳文件(分爲客戶端和服務端,客戶端負責上傳,服務端負責接收文件)
複製代碼
未實驗
複製代碼
未實驗
複製代碼
未實驗
複製代碼
springMVC 已經在配置的CommonsMultipartResolver這個轉換器裏面完成了文件解析:
調用common-fileupload的方式解析,而後再使用parseFileItems()方法封裝成本身的文件對象。
因此若是再次使用common-fileupload的方式進行解析獲取到的確定是空, 這個就是問題的所在:
在Controller裏面接收到的request都已是解析過的。
刪除Spring MVC文件上傳配置,能夠本身實現解析(見文章內)
實現進度監控:
重寫 CommonsMultipartResolver的parseRequest方法,
爲解析類FileUpload 設置自定義的ProgressListener監聽器,
進行解析文件,上傳並進行進度監控。修改配置文件。
複製代碼
java接收前端上傳的文件並將文件轉發存儲到靜態資源服務器。javascript
commons-net
包使用及封裝)HttpServletRequest
獲得上傳文件<div>
<label>上傳標題圖片:</label>
<form method="post" enctype="multipart/form-data" id="uploadImgForm">
<!-- 多選multiple="multiple" -->
<input type="file" name="img" id="uploadImgFile" onchange="imagePreviews()" accept="image/*" value="選擇圖片" />
</form>
</div>
複製代碼
<script type="text/javascript">
//下面用於多圖片上傳預覽功能
function imagePreviews(avalue) {
var docObj = document.getElementById("uploadImgFile");
var preview = document.getElementById("preview");
preview.innerHTML = "";
var fileList = docObj.files;
var tishi = "";
for (var i = 0; i < fileList.length; i++) {
preview.innerHTML += "<div style='float:left' > <img id='img" + i + "' /> </div>";
var imgObjPreview = document.getElementById("img"+i);
if (docObj.files && docObj.files[i]) {
if(docObj.files[i].size>20*1024*1024){
tishi+="第"+Number(i+1)+"張圖片過大,圖片上傳限制爲20M;";
continue;
}
//火狐下,直接設img屬性
imgObjPreview.style.display = 'block';
imgObjPreview.style.width = '200px';
imgObjPreview.style.height = '200px';
//imgObjPreview.src = docObj.files[0].getAsDataURL();
//火狐7以上版本不能用上面的getAsDataURL()方式獲取,須要一下方式
imgObjPreview.src = window.URL.createObjectURL(docObj.files[i]);
}
else {
//IE下,使用濾鏡
docObj.select();
var imgSrc = document.selection.createRange().text;
alert(imgSrc)
var localImagId = document.getElementById("img" + i);
//必須設置初始大小
localImagId.style.width = "200px";
localImagId.style.height = "150px";
//圖片異常的捕捉,防止用戶修改後綴來僞造圖片
try {
localImagId.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgSrc;
}
catch (e) {
alert("您上傳的圖片格式不正確,請從新選擇!");
return false;
}
imgObjPreview.style.display = 'none';
document.selection.empty();
}
}
if(tishi!=""){
alert(tishi);
}
return true;
}
//獲取(input type="file")的file數組,參數1:input的id
// 無文件返回null
function createFormData(inputIdStr) {
var inputObj = document.getElementById(inputIdStr);
var files = inputObj.files;
if (files.length == 0) {
return null;
}
// 經過FormData將文件轉成二進制數據
var formData = new FormData();
for (var i = 0; i < files.length; i++) {
// 將文件轉二進制
formData.append('files', files[i]);
}
return formData;
}
// 開始上傳請求
// formData:文件參數 ,由createFormData() 建立 ;添加其它參數formData.append('a', 其它參數);
function uploadWithXMLHttpRequest(formData, successCallback) {
var xhr = new XMLHttpRequest;
xhr.open('post', '${ctx }/upload/uploadImage.do');
// 監聽上傳進度
xhr.upload.onprogress = function (ev) {
// 事件對象
//var percent = (ev.loaded / ev.total) * 100 + '%';
// progress.style.width = percent;
}
xhr.upload.addEventListener("loadend", function(){
//使用 loadend 事件能夠偵測到全部的三種加載結束條件(abort、load,或 error):
//須要注意的是,沒有方法能夠確切的知道 loadend 事件接收到的信息是來自何種條件引發的操做終止;可是你能夠在全部傳輸結束的時候使用這個事件處理。
//console.log('loadend');
});
xhr.onreadystatechange = function () {
if(xhr.readyState == 4 && xhr.status == 200) {
if(typeof successCallback=='function'){
successCallback(xhr.responseText);//返回結果
}
}
}
xhr.send(formData);
}
function uploadWithJQuery() {
//var formData = createFormData("uploadImgFile");example
var formData = new FormData($("#uploadImgFile")[0]);// example
$.ajax({
url: '${ctx }/upload/uploadImage.do',
type: 'POST',
data: formdata, // 上傳formdata封裝的數據
dataType: 'JSON',
cache: false, // 不緩存
processData: false, // jQuery不要去處理髮送的數據
contentType: false, // jQuery不要去設置Content-Type請求頭
success:function (data) { //成功回調
//console.log(data);
}
});
}
//添加內容
function add_new() {
var title = $("#title").val();
var intro = $("#intro").val();
var contentURL = $("#contentURL").val();
if (isEmpty(title)) {
huialertautohide("標題不能爲空");
return;
} else if (isEmpty(intro)) {
huialertautohide("簡介不能爲空");
return;
} else if (isEmpty(contentURL)) {
huialertautohide("內容連接不能爲空");
return;
}
var formData = createFormData("uploadImgFile");
if (formData == null) {
huialertautohide("請選擇須要上傳的圖片");
return;
}
formData.append('title', title);
formData.append('intro', intro);
formData.append('contentURL', contentURL);
uploadWithXMLHttpRequest(formData, function(responseText){
var obj = JSON.parse(responseText);
console.log(obj);
var code = obj["code"];
console.log(code);
if (obj["code"] == "1") {
huialertautohide("添加成功");
setTimeout(function(){
user_add_close();
window.location.href = "${ctx }/newsManager/news_listIndex.do";
}, 1000);
}
});
}
</script>
<script type="text/javascript">
/* 關閉當前彈出框 */
function user_add_close(){
var index=parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
function huialertautohide(str) {
$.Huimodalalert(str, 2000);
}
//判斷字符是否爲空的方法
function isEmpty(obj){
if(typeof obj == "undefined" || obj == null || obj.length == 0 || obj.replace(/(^s*)|(s*$)/g, "").length == 0) {
return true;
}else{
return false;
}
}
</script>
複製代碼