您的位置:首页 > 其它

flex 文件上传与下载

2010-11-09 22:48 246 查看
flex 文件上传功能:

为了方便使用,所以自己根据网上一些资料自己写了一个mxml组件:

upload.mxml

如图



代码:

<mx:Button x="367" y="349" label="浏览..." cornerRadius="7" click="selectFile()"/>
<mx:DataGrid x="12" y="50" id="dg" width="587" height="291" dataProvider="{selectedFiles}">
<mx:columns>
<mx:DataGridColumn headerText="文件名" dataField="FILENAME" width="250"/>
<mx:DataGridColumn headerText="大小(KB)" dataField="FILESIZE" width="100"/>
<mx:DataGridColumn headerText="类型" dataField="FILETYPE" width="70"/>
<mx:DataGridColumn headerText="上传状态" dataField="" width="200">
<mx:itemRenderer>
<mx:Component>
<mx:HBox width="130" paddingLeft="2" horizontalGap="2" horizontalScrollPolicy="off" verticalScrollPolicy="off">
<mx:Script>
<![CDATA[
override public function set data(value:Object):void{
super.data = value;
progress.setProgress(0,data.fileRefrence.size);
data.fileRefrence.addEventListener(ProgressEvent.PROGRESS,progressHandler);
data.fileRefrence.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,fini);
data.fileRefrence.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
data.fileRefrence.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError);
}

private function progressHandler(event:ProgressEvent):void{
progress.setProgress(event.bytesLoaded,data.fileRefrence.size);
progress.label="已上传:"+Math.round((event.bytesLoaded * 100 /data.fileRefrence.size))+"%";
}
private function ioErrorHandler(event:IOErrorEvent):void{
outerDocument.lbl_error.text=event.text;
data.fileRefrence.removeEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
}
private function securityError(event:SecurityError):void{
outerDocument.lbl_error.text=event.message.toString();
data.fileRefrence.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError);
}

public function fini(event: DataEvent):void{
var retXml:XML=XML(event.data);
var retCode:int=int(retXml.retCode);
var retMsg:String=retXml.retMsg;
var serverDir:String=retXml.serverDir;
if(retCode==1){
data.STATUS=1;
data.FILEPATH=serverDir+outerDocument.relativePath+"/";
data.UPLOADDATE=outerDocument.df.format(new Date());
outerDocument.objMain.upLoadSucessFiles.addItem(data);
progress.label="完成";
}
else{
outerDocument.lbl_error.text=retMsg;
}
//移除监听
data.fileRefrence.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,fini);
data.fileRefrence.removeEventListener(ProgressEvent.PROGRESS,progressHandler);
//保存到数据库
outerDocument.doSave();
}
]]>
</mx:Script>
<mx:ProgressBar id="progress" width="80%"
minimum="0" maximum="{data.fileRefrence.size}" mode="manual"
labelPlacement="center" label="{data.READYWORD}">
</mx:ProgressBar>
<!-- 取消按钮-->
<mx:LinkButton id="btncancel" width="20" toolTip="取消上传" click="cancel()"
label="取消" icon="@Embed('style/assets/icons/cancel.png')">
<mx:Script>
<![CDATA[
private function cancel():void{
data.fileRefrence.cancel();
progress.label = "已取消";
outerDocument.doSave();
}
]]>
</mx:Script>
</mx:LinkButton>
<!-- 删除按钮-->
<mx:LinkButton width="20" click="deleteItem(event)" toolTip="从列表中删除" icon="@Embed('style/assets/icons/delete.png')">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;

private function deleteItem(event:MouseEvent):void {
var dg:Object = event.target.parent.outerDocument.dg;
var dp:ArrayCollection = ArrayCollection(dg.dataProvider);
var index:int = dp.getItemIndex(data);
dp.removeItemAt(index);
ArrayCollection(dg.dataProvider).refresh();

}
]]>
</mx:Script>
</mx:LinkButton>
</mx:HBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
<mx:Label id="lbl_bytes" width="495" color="red" x="28" y="10" text="文件数为:{this.selectedFiles.length},总大小为:{(this.fileListSize/(1024*1024)).toFixed(2)}MB"/>
<mx:Label id="lbl_error" width="567" color="red" x="10" y="381" text=""/>
<mx:Button x="448" y="349" label="上传" cornerRadius="7" id="btn_upload" enabled="{this.selectedFiles.length>0}" click="checkFileExist();" />
<mx:Button x="527" y="349" label="关闭" cornerRadius="7" click="closeWin();" />

/**
* 上传一个文件,监听文件上传完成事件,递归调用.
*/
private function doSingleUploadFile():void{
if (fileList.fileList.length > 0){
var f: FileReference = fileList.fileList.shift() as FileReference;
f.addEventListener(Event.COMPLETE, doSingleUploadFileComplete);
f.upload(new URLRequest(urlRequest));
}
}
/**
* 一个文件上传完成事件的处理函数,递归执行上传下一个文件.
*/
private function doSingleUploadFileComplete(event: Event):void{
var file: FileReference = event.target as FileReference;
file.removeEventListener(Event.COMPLETE, doSingleUploadFileComplete);
doSingleUploadFile();
}

涉及到的JAVA类有:

FileUploadAction.java//文件上传类

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.tydic.osgi.org.springframework.commons.SystemProperties;

public class FileUploadAction extends HttpServlet {

// 定义文件的上传路径

private String uploadPath = "d://a//";

// 限制文件的上传大小

private int maxPostSize = 100 * 1024 * 1024;

public FileUploadAction() {
super();
}
public void destory(){
super.destroy();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doupload(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doupload(request, response);
}
private String getClassSavePath(){
String SavePath=getClass().getClassLoader().getResource("/").getPath()+"../../";
//String path_name = SystemProperties.getProperty("UPLOAD_PATH");
return SavePath;
}
private String getServerPath(){
String SavePath=getClass().getClassLoader().getResource("/").getPath()+"../../";
SavePath=SavePath.substring(0,SavePath.indexOf("BMP")+4);
//String path_name = SystemProperties.getProperty("UPLOAD_PATH");
return SavePath;
}

public void doupload(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");

System.out.println("Access !");
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("utf-8");
uploadPath = request.getParameter("txtFilePath");
if("".equals(uploadPath)||null==uploadPath){
response
.getWriter()
.print(
"<?xml version=/"1.0/" encoding=/"utf-8/"?><retInfo><retCode>0</retCode><retMsg>上传路径为空</retMsg></retInfo>");
}else{
String retInfo="上传OK!";
String retCode="1";
String fileName = request.getParameter("fileName");
String strDir=getClassSavePath()+uploadPath;
String serverDir=getServerPath();
//保存文件到服务器中
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(maxPostSize);
try {
List fileItems = upload.parseRequest(request);
Iterator iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {
String name = item.getName();
if(!("".equals(fileName))&&null!=fileName){
name = fileName;
}
try {
File dir=new File(strDir);
if(!dir.exists()||!dir.isDirectory())
{
dir.mkdir();
}
item.write(new File(strDir+"/" + name));//写入文件

} catch (Exception e) {
e.printStackTrace();
retCode="0";
retInfo=e.getMessage();
throw new IOException("文件上传失败");
}
}
}
} catch (FileUploadException e) {
retCode="0";
retInfo=e.getMessage();
e.printStackTrace();
System.out.println(e.getMessage() + "结束");
}
response
.getWriter()
.print(
"<?xml version=/"1.0/" encoding=/"utf-8/"?><retInfo><retCode>"+retCode+"</retCode><retMsg>"+retInfo+"</retMsg><serverDir>"+serverDir+"</serverDir></retInfo>");
}

}
}

文件下载有两种方式:

<mx:DataGrid height="99%" width="99%" dataProvider="{dgResult}">
<mx:columns>
<mx:DataGridColumn headerText="文件名" dataField="FILE_NAME" width="200" />
<mx:DataGridColumn headerText="大小(KB)" dataField="FILE_SIZE" width="70" />
<mx:DataGridColumn headerText="上传时间" dataField="STATE_DATE" width="120"/>
<mx:DataGridColumn headerText="操作" width="80">
<mx:itemRenderer>
<mx:Component>
<mx:LinkButton label="下载" icon="{outerDocument.attachIcon}" click="outerDocument.downloadAttach(data)"/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>

private var fileRef:FileReference;

public function downloadAttach(item:Object):void{
//var str:String=item.FILE_PATH;

//方法一:弹出新容器用java类返回
//var url:String=serverUrl+downloadAction+"?relPath="+str.substr(0,str.indexOf("/"))+"&filename="+item.FILE_NAME;
//navigateToURL(new URLRequest(url), "_blank");

//方法二:用filerefernce
var urlReq:String=serverUrl+item.FILE_PATH;
fileRef.download(new URLRequest(urlReq));
}
private function initFile():void{
fileRef = new FileReference();
fileRef.addEventListener(Event.CANCEL, doEvent);
fileRef.addEventListener(Event.COMPLETE, completeHandler);
fileRef.addEventListener(Event.OPEN, doEvent);
fileRef.addEventListener(Event.SELECT, doEvent);
fileRef.addEventListener(HTTPStatusEvent.HTTP_STATUS, doEvent);
fileRef.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
fileRef.addEventListener(ProgressEvent.PROGRESS, processEvent);
fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, doEvent);
}
private function doEvent(evt:Event):void {
// 取得当前FileReference的引用
var fr:FileReference = evt.currentTarget as FileReference;
trace("evt Type:"+evt.type+"evt"+evt.toString());
}
private function processEvent(event:ProgressEvent):void{
dl_cancel.visible=true;
mydlBar.maximum=event.bytesTotal;
mydlBar.setProgress(event.bytesLoaded,event.bytesTotal);
mydlBar.label="已下载:"+Math.round((event.bytesLoaded * 100 /event.bytesTotal))+"%";
}
private function cancelHandler():void{
this.fileRef.cancel();
dl_cancel.visible=false;
}
private function completeHandler(event:Event):void{
mydlBar.label="已完成";
dl_cancel.visible=false;
}
private function ioErrorHandler(event:IOErrorEvent):void{
Alert.show(event.text);
}

文件下载的java类:

FileDownloadAction.java //文件下载类

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileDownloadAction extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String fileName = "";
String relativePath="";
if (null != request.getParameter("filename")) {
fileName = request.getParameter("filename");
}
if (null != request.getParameter("relPath")) {
relativePath=request.getParameter("relPath");
}
response.setContentType("application/x-msdownload");
response.setHeader("Content-disposition", "attachment;filename="
+ fileName);
if (!"".equals(fileName) && !"".equals(relativePath)) {
String realPath=getClassSavePath()+relativePath+"/"+fileName;
System.out.println("文件路径名:"+realPath);
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(realPath));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[1024];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} finally {
if (null != bis)
bis.close();
if (null != bos)
bos.close();
}
}

}
private String getClassSavePath(){
String SavePath=getClass().getClassLoader().getResource("/").getPath()+"../../";
return SavePath;
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: