Thinkphp拖拽上傳檔案-使用webuploader外掛(自己改動了一些地方)——分片上傳
html頁面: <!DOCTYPE html> <html class="js cssanimations"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Thinkphp拖拽上傳檔案-使用webuploader外掛</title> <include file="Inc/css" /> <link rel="stylesheet" href="__PUBLIC__/webuploader/xb-webuploader.css"> <script src="__PUBLIC__/js/jquery.min.js"></script> <script src="__PUBLIC__/webuploader/webuploader.min.js"></script> </head> <body> <div class="admin-content"> <form action="{:U('Mafull/webuploader')}" method="post" > <div id="upload-57c79f4938104" class="xb-uploader"> <input type="hidden" name="image" id="image"> <div class="queueList"> <div class="placeholder" style="padding: 20px"> <div class="filePicker"></div> </div> </div> <div class="statusBar" style="display:none;"> <div class="progress"> <span class="text">0%</span> <span class="percentage"></span> </div> <div class="info"></div> <!-- <div class="btns"> <div class="uploadBtn">開始上傳</div> </div>--> </div> </div> </div> </form> </div> <script> /*上傳檔案操作 開始*/ jQuery(function() { var $ = jQuery, // just in case. Make sure it's not an other libaray. $wrap = $("#upload-57c79f4938104"), // 圖片容器 $queue = $('<ul class="filelist"></ul>') .appendTo( $wrap.find('.queueList') ), // 狀態列,包括進度和控制按鈕 $statusBar = $wrap.find('.statusBar'), // 檔案總體選擇資訊。 $info = $statusBar.find('.info'), // 上傳按鈕 $upload = $wrap.find('.uploadBtn'), // 沒選擇檔案之前的內容。 $placeHolder = $wrap.find('.placeholder'), // 總體進度條 $progress = $statusBar.find('.progress').hide(), // 新增的檔案數量 fileCount = 0, // 新增的檔案總大小 fileSize = 0, // 優化retina, 在retina下這個值是2 ratio = window.devicePixelRatio || 1, // 縮圖大小 thumbnailWidth = 110 * ratio, thumbnailHeight = 110 * ratio, // 可能有pedding, ready, uploading, confirm, done. state = 'pedding', // 所有檔案的進度資訊,key為file id percentages = {}, supportTransition = (function(){ var s = document.createElement('p').style, r = 'transition' in s || 'WebkitTransition' in s || 'MozTransition' in s || 'msTransition' in s || 'OTransition' in s; s = null; return r; })(), // WebUploader例項 uploader; if ( !WebUploader.Uploader.support() ) { alert( 'Web Uploader 不支援您的瀏覽器!如果你使用的是IE瀏覽器,請嘗試升級 flash 播放器'); throw new Error( 'WebUploader does not support the browser you are using.' ); } // 例項化 uploader = WebUploader.create({ auto: true,// 選完檔案後,是否自動上傳。 compress:false, pick: { id: "#upload-57c79f4938104 .filePicker", label: '點選選擇檔案', multiple : true }, dnd: "#upload-57c79f4938104 .queueList", paste: document.body, // swf檔案路徑 swf: BASE_URL + '/Uploader.swf', disableGlobalDnd: true,// [可選] [預設值:false]是否禁掉整個頁面的拖拽功能,如果不禁用,圖片拖進來的時候會預設被瀏覽器開啟。 server: "__URL__/ajax_upload", chunked: true,//是否切片 chunkSize:10*1024*1024, fileNumLimit: 1, fileSizeLimit: 1024 * 1024 * 1024, // 1G fileSingleSizeLimit: 1024 * 1024 * 1024 // 1G }); // 當有檔案新增進來時執行,負責view的建立 function addFile( file ) { var $li = $( '<li id="' + file.id + '">' + '<p class="title">' + file.name + '</p>' + '<p class="imgWrap"></p>'+ '<p class="progress"><span></span></p>' + '</li>' ), $btns = $('<div class="file-panel">' + '<span class="cancel">刪除</span>' + '<span class="rotateRight">向右旋轉</span>' + '<span class="rotateLeft">向左旋轉</span></div>').appendTo( $li ), $prgress = $li.find('p.progress span'), $wrap = $li.find( 'p.imgWrap' ), $info = $('<p class="error"></p>'), showError = function( code ) { switch( code ) { case 'exceed_size': text = '檔案大小超出'; break; case 'interrupt': text = '上傳暫停'; break; default: text = '上傳失敗,請重試'; break; } $info.text( text ).appendTo( $li ); }; if ( file.getStatus() === 'invalid' ) { showError( file.statusText ); } else { // @todo lazyload $wrap.text( '預覽中' ); uploader.makeThumb( file, function( error, src ) { if ( error ) { $wrap.text( '不能預覽' ); return; } var img = $('<img src="'+src+'">'); $wrap.empty().append( img ); }, thumbnailWidth, thumbnailHeight ); percentages[ file.id ] = [ file.size, 0 ]; file.rotation = 0; } file.on('statuschange', function( cur, prev ) { if ( prev === 'progress' ) { $prgress.hide().width(0); } else if ( prev === 'queued' ) { $li.off( 'mouseenter mouseleave' ); $btns.remove(); } // 成功 if ( cur === 'error' || cur === 'invalid' ) { console.log( file.statusText ); showError( file.statusText ); percentages[ file.id ][ 1 ] = 1; } else if ( cur === 'interrupt' ) { showError( 'interrupt' ); } else if ( cur === 'queued' ) { percentages[ file.id ][ 1 ] = 0; } else if ( cur === 'progress' ) { $info.remove(); $prgress.css('display', 'block'); } else if ( cur === 'complete' ) { $li.append( '<span class="success"></span>' ); } $li.removeClass( 'state-' + prev ).addClass( 'state-' + cur ); }); $li.on( 'mouseenter', function() { $btns.stop().animate({height: 30}); }); $li.on( 'mouseleave', function() { $btns.stop().animate({height: 0}); }); $btns.on( 'click', 'span', function() { var index = $(this).index(), deg; switch ( index ) { case 0: uploader.removeFile( file ); return; case 1: file.rotation += 90; break; case 2: file.rotation -= 90; break; } if ( supportTransition ) { deg = 'rotate(' + file.rotation + 'deg)'; $wrap.css({ '-webkit-transform': deg, '-mos-transform': deg, '-o-transform': deg, 'transform': deg }); } else { $wrap.css( 'filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation='+ (~~((file.rotation/90)%4 + 4)%4) +')'); } }); $li.appendTo( $queue ); } // 負責view的銷燬 function removeFile( file ) { var $li = $('#'+file.id); delete percentages[ file.id ]; updateTotalProgress(); $li.off().find('.file-panel').off().end().remove(); } function updateTotalProgress() { var loaded = 0, total = 0, spans = $progress.children(), percent; $.each( percentages, function( k, v ) { total += v[ 0 ]; loaded += v[ 0 ] * v[ 1 ]; } ); percent = total ? loaded / total : 0; spans.eq( 0 ).text( Math.round( percent * 100 ) + '%' ); spans.eq( 1 ).css( 'width', Math.round( percent * 100 ) + '%' ); updateStatus(); } function updateStatus() { var text = '', stats; if ( state === 'ready' ) { text = '選中' + fileCount + '個檔案,共' + WebUploader.formatSize( fileSize ) + '。'; } else if ( state === 'confirm' ) { stats = uploader.getStats(); if ( stats.uploadFailNum ) { text = '已成功上傳' + stats.successNum+ '個檔案,'+ stats.uploadFailNum + '個上傳失敗,<a class="retry" href="#">重新上傳</a>失敗檔案或<a class="ignore" href="#">忽略</a>' } } else { stats = uploader.getStats(); if(stats.successNum==0){ text=""; } else { text = '共' + fileCount + '個(' + WebUploader.formatSize( fileSize ) + '),已上傳' + stats.successNum + '個<br /><p style="font-size:22px; color:#0b8cec;font-weight: bold;">已上傳成功,點選“下一步”吧</p>'; } if ( stats.uploadFailNum ) { text += ',失敗' + stats.uploadFailNum + '個'; } } var txtSize=WebUploader.formatSize(fileSize); if(txtSize=="0B"){ $("#upload-57c79f4938104 input[name='size']").val(''); } else{ $("#upload-57c79f4938104 input[name='size']").val(txtSize); } $info.html( text ); } uploader.onUploadAccept=function(object ,ret){ if(ret.error_info){ fileError=ret.error_info; return false; } } uploader.onUploadSuccess=function(file ,response){ fileName=response.filePath; filePixels=response.filePixels; } uploader.onUploadError=function(file){ alert(fileError); } function setState( val ) { var file, stats; if ( val === state ) { return; } $upload.removeClass( 'state-' + state ); $upload.addClass( 'state-' + val ); state = val; switch ( state ) { case 'pedding': $placeHolder.removeClass( 'element-invisible' ); $queue.parent().removeClass('filled'); $queue.hide(); $statusBar.addClass( 'element-invisible' ); uploader.refresh(); break; case 'ready': $placeHolder.addClass( 'element-invisible' ); $( "#upload-57c79f4938104 .filePicker2" ).removeClass( 'element-invisible'); $queue.parent().addClass('filled'); $queue.show(); $statusBar.removeClass('element-invisible'); uploader.refresh(); break; case 'uploading': $( "#upload-57c79f4938104 .filePicker2" ).addClass( 'element-invisible' ); $progress.show(); $upload.text( '暫停上傳' ); break; case 'paused': $progress.show(); $upload.text( '繼續上傳' ); break; case 'confirm': $progress.hide(); $upload.text( '開始上傳' ).addClass( 'disabled' ); stats = uploader.getStats(); if ( stats.successNum && !stats.uploadFailNum ) { setState( 'finish' ); return; } break; case 'finish': stats = uploader.getStats(); if ( stats.successNum ) { $("#upload-57c79f4938104 input[name='image']").val(fileName); if(filePixels=="*px"){ $("#upload-57c79f4938104 input[name='pixels']").val(); } else { $("#upload-57c79f4938104 input[name='pixels']").val(filePixels); } } else { // 沒有成功的圖片,重設 state = 'done'; location.reload(); } break; } updateStatus(); } uploader.onUploadProgress = function( file, percentage ) { var $li = $('#'+file.id), $percent = $li.find('.progress span'); $percent.css( 'width', percentage * 100 + '%' ); percentages[ file.id ][ 1 ] = percentage; updateTotalProgress(); }; uploader.onFileQueued = function( file ) { fileCount++; fileSize += file.size; if ( fileCount === 1 ) { $placeHolder.addClass( 'element-invisible' ); $statusBar.show(); } addFile( file ); setState( 'ready' ); updateTotalProgress(); }; uploader.onFileDequeued = function( file ) { fileCount--; fileSize -= file.size; if ( !fileCount ) { setState( 'pedding' ); } removeFile( file ); updateTotalProgress(); }; uploader.on( 'all', function( type ) { var stats; switch( type ) { case 'uploadFinished': setState( 'confirm' ); break; case 'startUpload': setState( 'uploading' ); break; case 'stopUpload': setState( 'paused' ); break; } }); uploader.onError = function( code ) { alert( 'Eroor: ' + code ); }; $upload.on('click', function() { if ( $(this).hasClass( 'disabled' ) ) { return false; } if ( state === 'ready' ) { uploader.upload(); } else if ( state === 'paused' ) { uploader.upload(); } else if ( state === 'uploading' ) { uploader.stop(); } }); $info.on( 'click', '.retry', function() { uploader.retry(); } ); $info.on( 'click', '.ignore', function() { alert( 'todo' ); } ); $upload.addClass( 'state-' + state ); updateTotalProgress(); }); /*上傳檔案操作 結束*/ </script> <script> var BASE_URL = '__PUBLIC__/webuploader'; </script> <script src="__PUBLIC__/webuploader/webuploader.min.js"></script> </body> </html>
php:MafullController.class.php中寫入上傳方法: /** * webuploader 上傳demo */ public function webuploader(){ // 如果是post提交則顯示上傳的檔案 否則顯示上傳頁面 if(IS_POST){ $image=I('post.image'); // 判斷是否有檔案上傳 if (empty($image)) { die('沒有上傳檔案'); } echo '上傳成功路徑為:'.$image; }else{ $this->display(); } } //切片上傳方法 public function ajax_upload() { //故意寫一個過期時間目的也是讓瀏覽器去重新讀取頁面內容.你要知道,瀏覽器一般情況下去儲存你訪問過的頁面的大部分內容,你第二次訪問的時候,儲存的內容(稱為快取)瀏覽器就不需要再向伺服器請求了,這樣節約時間,也減輕了伺服器的負擔. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");//內容過期時間 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");//標記內容最後修改時間 header("Cache-Control: no-store, no-cache, must-revalidate");//強制不快取 header("Cache-Control: post-check=0, pre-check=0", false);//Internet Explorer 5對於HTTP頭資訊使用兩種新的時間間隔指示 header("Pragma: no-cache");//禁止本頁被快取 //$_SERVER['REQUEST_METHOD']這個變量表示的是表單提交資料的方式,get或者post if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { exit; // 完成預檢CORS請求 } if ( !empty($_REQUEST[ 'debug' ]) ) { $random = rand(0, intval($_REQUEST[ 'debug' ]) ); if ( $random === 0 ) { header("HTTP/1.0 500 Internal Server Error"); exit; } } // 5分鐘執行時間 @set_time_limit(5 * 60); $targetDir = 'Public\Upload'.DIRECTORY_SEPARATOR.'file_material_tmp'; $uploadDir = 'Public\Upload'.DIRECTORY_SEPARATOR.'file_material'; $cleanupTargetDir = true; // 是否刪除以前的臨時檔案內容 $maxFileAge = 5 * 3600; // 臨時檔案時間(以秒為單位) // 獲取檔名 if (!file_exists($targetDir)) { @mkdir($targetDir);//mkdir() 函式建立目錄。 } // 建立目標目錄 if (!file_exists($uploadDir)) { @mkdir($uploadDir);//mkdir() 函式建立目錄。 } // 獲取檔名 if (isset($_REQUEST["name"])) { $fileName = $_REQUEST["name"]; } elseif (!empty($_FILES)) { $fileName = $_FILES["file"]["name"]; } else { $fileName = uniqid("file_"); } $fileName=iconv("UTF-8", "gb2312", $fileName); $oldName = $fileName; $filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName; // 取得chunk和chunks $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0; $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 1; // 刪除以前的臨時檔案內容,如:file_material_tmp資料夾內的檔案 if ($cleanupTargetDir) { if (!is_dir($targetDir) || !$dir = opendir($targetDir)) { //is_dir -- 判斷給定檔名是否是一個目錄 //opendir()函式的作用是:開啟目錄控制代碼。 die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}'); } while (($file = readdir($dir)) !== false) {//readdir ,readdir_r,----讀一個目錄 $tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file; // 如果臨時檔案是當前檔案,繼續下一步 if ($tmpfilePath == "{$filePath}_{$chunk}.part" || $tmpfilePath == "{$filePath}_{$chunk}.parttmp") { continue; } // 刪除臨時檔案,如果它早於最大年齡,並且不是當前檔案 //preg_match() 函式用於進行正則表示式匹配,成功返回 1 ,否則返回 0 if (preg_match('/\.(part|parttmp)$/', $file) && (@filemtime($tmpfilePath) < time() - $maxFileAge)) { //filemtime() 函式返回檔案內容上次的修改時間。若成功,則時間以 Unix 時間戳的方式返回。若失敗,則返回 false。 @unlink($tmpfilePath);//unlink() 函式刪除檔案。 } } closedir($dir); } // 開啟臨時檔案 if (!$out = @fopen("{$filePath}_{$chunk}.parttmp", "wb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); } if (!empty($_FILES)) { if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) { die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}'); } // 讀取二進位制輸入流並將其附加到臨時檔案 if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); } } else { if (!$in = @fopen("php://input", "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); } } while ($buff = fread($in, 4096)) { fwrite($out, $buff); } @fclose($out); @fclose($in); rename("{$filePath}_{$chunk}.parttmp", "{$filePath}_{$chunk}.part"); $index = 0; $done = true; for( $index = 0; $index < $chunks; $index++ ) { if ( !file_exists("{$filePath}_{$index}.part") ) { $done = false; break; } } if ( $done ) { $pathInfo = pathinfo($fileName); $hashStr = substr(md5($pathInfo['basename']),8,16); $hashName = time() . $hashStr . '.' .$pathInfo['extension']; $uploadPath = $uploadDir . DIRECTORY_SEPARATOR .$hashName; if (!$out = @fopen($uploadPath, "wb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); } if ( flock($out, LOCK_EX) ) { for( $index = 0; $index < $chunks; $index++ ) { if (!$in = @fopen("{$filePath}_{$index}.part", "rb")) { break; } while ($buff = fread($in, 4096)) { fwrite($out, $buff); } @fclose($in); @unlink("{$filePath}_{$index}.part"); } flock($out, LOCK_UN); } @fclose($out); //$data=array(); //$data['name']=$uploadPath;//Public\Upload\file_material\14793553561ee00a15b8a23204.jpg //echo json_encode($data);` //exit; //$data['name']=trim($uploadPath); $list = getimagesize($uploadPath); $data['pixels']=trim($list[0]."*".$list[1].'px'); $response = array( 'success'=>true, 'oldName'=>$oldName, 'filePath'=>trim(str_replace("\\","/",substr($uploadPath,6))), 'fileSize'=>$data['size'], 'fileSuffixes'=>$pathInfo['extension'], 'file_id'=>$data['id'], 'filePixels'=>$data['pixels'], ); die(json_encode($response)); } // 返回成功JSON-RPC響應 die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}'); }
相關推薦
Thinkphp拖拽上傳檔案-使用webuploader外掛(自己改動了一些地方)——分片上傳
html頁面: <!DOCTYPE html> <html class="js cssanimations"> <head> <meta http-equiv="Content-Type" content="text
Thinkphp拖拽上傳檔案-使用webuploader外掛(自己稍微改動了一些地方)——不切片上傳
在拖拽或選擇上傳會遇到上傳檔案大小限制問題——如果檔案很大,可以做切片,也可以不做切片,如果不做切片,檔案太大,可能會上傳失敗,因為“WAMP資料庫上傳檔案的大小及上傳時間會受限制”,可以進行一下操作: 檔案大小限制問題轉載連結:http://blog.csdn.net/l
上傳圖片裁剪外掛(基於cropper.js的封裝)
如題,這樣的功能在開發中是非常常見的,cropper.js是一款很好的工具,網上都有詳細的介紹,這篇文章提示很多友好的API和事件cropper.js 裁剪圖片並上傳(文件翻譯+demo) cropper.js需要藉助jquery來實現,所以我這裡的樣式抄襲了
ubuntu下使用filezilla上傳檔案許可權問題(open for write: permission denied)
今天在使用filezilla連線虛擬機器中的ubuntu的時候出現上次出錯,錯誤詳情為: open for write: permission denied 看完錯誤大概知道和許可權有問題,
File Uploader:支援進度顯示與檔案拖拽的多檔案上傳前端JS指令碼
File Uploader的前身是Ajax Upload。按照官方的說法,升級到FileUploader主要是添加了一些新的特性,修正了一些比較嚴重的錯誤。但在我這個使用者看來,二者最大的不同在於:File Uploader不在基於jQuery。另外,File Upload
利用拖拽效果實現檔案上傳功能
1、獲取檔案的方法file物件是來自使用者在一個<input>表單元素上選擇檔案後返回的filelist物件,也可以是來自自由拖拽操作生成的dataTransfer物件,dataTransf
使用thinkphp實現上傳檔案(uploadify外掛)
語言:php 框架:thinkphp3.2.3 上傳外掛:uploadify 1、在html頁面或者模板中引入CSS和JS <link rel="stylesheet" type="text
bootstrap-fileinput上傳檔案的外掛使用總結----編輯已成功上傳過的圖片
這裡所講述的是:編輯已成功上傳過的圖片 參考:Initial Preview Data http://plugins.krajee.com/file-preview-management-demo下面標記紅色的部<!-- PREVIEW DATA --><!-- PREVIEW DATA
spring mvc 上傳檔案幫助類(留備用)
package com.service.impl; import com.entity.UploadInfo; import com.service.UploadHelp; import org.springframework.web.context.ContextLoader; import o
Windows如何連線linux和上傳檔案到linux(securcrt)
一般開發在Windows,部署專案在linux這個時候就要選一個方便的軟體可以將專案扔到linux上去了,securcrt.這個軟體很好實用 網上很多免安裝版的,開啟即用,首先是連線linux 這個就不說 輸入公網ip 使用者名稱 密碼就可以 SecureCRTPo
webAPI 上傳檔案 404錯誤(轉載) webAPI檔案上傳時檔案過大404錯誤的問題
webAPI檔案上傳時檔案過大404錯誤的問題 來源:https://www.cnblogs.com/dzhengyang/p/9149157.html 背景:最近公司有個需求,外網希望自動儲存資料到內網,內網有2臺伺服器可以相互訪問,其中一臺伺服器外網可以訪問,於是想在
上傳檔案Base64格式(React)
記錄一下上傳檔案時將檔案資料轉為Base64的方法 通過 FileReader物件建立一個例項,然後使用 readAsDataURL方法將資料轉為Base64格式 注意: 讀取
chrome 67版本後無法拖拽離線安裝CRX格式外掛的解決方法
第一種:開啟開發者模式即可 (推薦) chrome 的設定 -> 更多工具 -> 擴充套件程式,開啟開發者模式即可! 這是最簡單的方法,小編自己就是使用的這種方法! 第二種方法:修改引數 首先開啟下面地址:chrome://flags/#extensions-on
js、css檔案無法拖拽到jsp檔案裡的問題解決方法
近來新入職,公司電腦用的是myeclipse 2016,在開發的時候遇到js和css檔案無法拖拽到jsp裡的問題,網上搜索很多答案都不能解決,最後在某一論壇找到答案,如下: 1.window-prefences-general-Editors-Text-editors-enable drag an
百度UEditor自定義上傳檔案儲存路徑(補充)
上一篇百度UEditor自定義上傳檔案儲存路徑發表後,再解決了線上管理、線上圖片和線上附件功能不能使用的問題。 需要修改FileManager類: 註釋掉的程式碼是原來jar包的程式碼,不再需要,可以刪除掉。 //private String di
微信小程式 —— 上傳檔案到伺服器(例:上傳圖片到伺服器)
上傳圖片到伺服器: 1.先在前端寫一個選擇圖片的區域來觸發wx.chooseImage介面並用wx.setStorage介面把圖片路徑存起來。 -wxml <view class="
nginx上傳檔案大小限制(413 Request Entity Too Large錯誤解決)
nginx預設上傳最大值是1M 在nginx.conf中新增配置client_max_body_size即可,如下上傳最大為20M client_max_body_size 20m; (修改nginx.conf檔案操作如不會,請參考: https://blog
iOS上傳檔案或base64(圖片)之AFNetworking 3.0+上傳檔案上傳圖片
1. base64 上傳圖片 /** * 上傳圖片到伺服器 * * @param image * @param photoID * @param photoType */ - (
解決使用FTPClient物件或FtpUtil工具類上傳檔案為空(搭建Nginx圖片伺服器
一、使用FTPClient上傳檔案為空 JAVA使用FTPClient上傳檔案時總是為空,有些資料說防火牆設定問題,但是本機防火牆已設定過。 後來查了下資料,FTP伺服器有被動模式和主動模式。 在JAVA中將FTPClient設定為被動模式即可解決問題。 **FT
httpclient (httppost)上傳檔案 指定格式(text/plain)
public void fileupload(String para1,String para2,String filename,String path){ HttpClient client = new DefaultHttpClient(); //超時設定-3