java完成ftp傳輸(將文件上傳至靜態資源服務器)

Nginx實現靜態資源服務器

apache實現靜態資源服務器


參考文章記錄

JavaWeb靜態資源分離思路

靜態資源分離就是把靜態資源放到另外一臺服務器上,web服務器只發布web項目
配置啓動靜態資源服務,讓資源文件經過http方式可訪問,
常見方案是使用nginx或者apache設置映射,這樣就能經過瀏覽器訪問到 Linux服務器中的文件
java 實現上傳文件到遠程服務器經常使用方案:
java上傳文件到ftp服務器(這個方案須要在靜態資源服務器安裝ftp服務)
java使用HttpURLConnection上傳文件到遠程服務器 (分爲客戶端和服務端,客戶端負責上傳,服務端負責接收文件)
java使用HttpClient經過Post上傳文件(分爲客戶端和服務端,客戶端負責上傳,服務端負責接收文件)
複製代碼

java上傳文件到遠程服務器(一)---HttpURLConnection方式

未實驗
複製代碼

java上傳文件到遠程服務器(二)---HttpClient方式

未實驗
複製代碼

java上傳文件到遠程服務器七牛雲

未實驗
複製代碼

SpringMVC中servletFileUpload.parseRequest(request)解析爲空獲取不到數據問題

springMVC 已經在配置的CommonsMultipartResolver這個轉換器裏面完成了文件解析:
調用common-fileupload的方式解析,而後再使用parseFileItems()方法封裝成本身的文件對象。

因此若是再次使用common-fileupload的方式進行解析獲取到的確定是空, 這個就是問題的所在:
在Controller裏面接收到的request都已是解析過的。

刪除Spring MVC文件上傳配置,能夠本身實現解析(見文章內)

實現進度監控:
重寫 CommonsMultipartResolver的parseRequest方法,
爲解析類FileUpload 設置自定義的ProgressListener監聽器,
進行解析文件,上傳並進行進度監控。修改配置文件。
複製代碼

java完成ftp傳輸

目的

java接收前端上傳的文件並將文件轉發存儲到靜態資源服務器。javascript

分析

  • java實現ftp上傳(commons-net包使用及封裝)
  • 不使用進度,解析HttpServletRequest獲得上傳文件
  • 將文件上傳到ftp地址
  • 進度監聽及封裝(未實現)
  • 前端上傳js、HTML代碼

實現

java上傳實現:

safiriGitHub/FTPUtil前端

前端上傳js、HTML代碼

<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>
複製代碼
相關文章
相關標籤/搜索