在研究Flex DataGrid导入excel时,用到了Flex的文件上传功能。 (参见我的Blog:http://cwfmaker.javaeye.com/blog/539449) 在Adobe的Flex RIA编程环境下,是无法读取本地文件的(据我所知),但是我们可以依赖于Flex调用后台的代码实现文件上传功能,我这里是利用Flex的URLRequest来向java的Servlet传送一个Http请求(Servlet集成自HttpServlet ,已实现文件上传功能),而Servlet响应请求之后会利用Apcahe的开源Jar包(org.apache.commons.fileupload.servlet.ServletFileUpload类)完成文件的生成。 通过以上原理就可以利用Flex+java实现文件上传。(这里也是参考了网上的一些文章)
java Servlet 代码
Java代码
- package com.yyhy.java.util;
-
- //多文件上传的Java端的类
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.ServletException;
- import java.util.List;
- import java.util.Iterator;
- import java.io.File;
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.net.URLDecoder;
- import org.apache.commons.fileupload.FileUploadException;
- import org.apache.commons.fileupload.disk.DiskFileItemFactory;
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
- import org.apache.commons.fileupload.FileItem;
- import org.apache.log4j.Logger;
- import org.apache.commons.lang.ObjectUtils;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-
- public class FileUploadAction extends HttpServlet {
-
- // 限制文件的上传大小
- private int maxPostSize = 100 * 1024 * 1024;
- //文件上传地址
- private String uploadPath;
-
- public FileUploadAction() {
- //从配置文件中取得文件上传地址
- setUploadPath();
- }
- public String getUploadPath() {
- return uploadPath;
- }
- public void setUploadPath() {
- //从配置文件中取得文件上传地址
- ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- ServerAddress serverAddressBean=(ServerAddress)context.getBean("ServerAddressBean");
- this.uploadPath = serverAddressBean.getUploadPath().trim();
- }
- // 文件上传
- public void service(HttpServletRequest request, HttpServletResponse response)
- throws ServletException
- {
- this.doUploadAdd(request, response);
- }
-
- private void logger(String info) {
- System.out.println(info);
- }
-
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doUploadAdd(request, response);
- }
-
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doUploadAdd(request, response);
- }
-
- private void doUploadAdd(HttpServletRequest request,
- HttpServletResponse response) throws ServletException {
- logger("begin to upload");
- try {
- request.setCharacterEncoding("UTF-8");// 防止文件名称带有汉字后传到服务器乱码
- //建立文件夹
- this.makeDir(uploadPath);
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- saveFiletoServer(request,response,uploadPath);
- }
-
- private void doUploadDelete(HttpServletRequest request,HttpServletResponse response) throws ServletException
- {
- String dirtyStr = "";//需要删除的文件名(单个文件)或文件夹名列表
- try
- {
- if (request.getParameter("dirtyStr") != null) {
- dirtyStr=URLDecoder.decode(request.getParameter("dirtyStr"),"utf-8");//前台ENCODE,后台DECODE
- logger("删除的文件(夹)为:" + dirtyStr);
- }
- }
- catch (Exception e) {
- // TODO Auto-generated catch block
- logger(e.getMessage());
- }
-
- try {
- new DeleteFiles().DeleteModifyFiles(dirtyStr, uploadPath);
- } catch (Exception e) {
- logger(e.getMessage());
- }
- }
- //保存文件到服务器中
- private void saveFiletoServer(HttpServletRequest request,HttpServletResponse response,String uploadPath)
- {
- // 操作文件
- response.setContentType("text/html; charset=UTF-8");
- DiskFileItemFactory factory = new DiskFileItemFactory();
- factory.setSizeThreshold(1024 * 4);
- ServletFileUpload upload = new ServletFileUpload(factory);
- upload.setFileSizeMax(maxPostSize);
- logger("request========" + ObjectUtils.toString(request));
- List fileItems = null;
- try {
- fileItems = upload.parseRequest(request);
- logger("============" + ObjectUtils.toString(fileItems));
- Iterator iter = fileItems.iterator();
- while (iter.hasNext()) {
- FileItem item = (FileItem) iter.next();
- log(item.toString());
- if (!item.isFormField()) {
- String name = item.getName();
- logger("上传的文件名 = " + name);
- try {
- item.write(new File(uploadPath + name));
- } catch (Exception ex) {
- logger(ex.getMessage());
- }
- }
- }
- } catch (FileUploadException ex1) {
- logger("FileUploadException->" + ex1.getMessage());
- }
- }
- // 建立文件夹路径
- private boolean makeDir(String uploadPath) {
- boolean isOK = false;
- try {
- File file = new File(uploadPath);
- file.mkdirs();
- isOK = true;
- } catch (Exception e) {
- isOK = false;
- } finally {
- return isOK;
- }
- }
- // 建立文件夹路径
- private boolean makeDirs(String uploadPath, String newDocStr) {
- boolean isOK = false;
- File file;
- String[] temp;
- try {
- temp = newDocStr.split(",");
- for (int i = 0; i < temp.length; i++) {
- file = new File(uploadPath + temp[i] + "\\");
- file.mkdirs();
- }
- isOK = true;
- } catch (Exception e) {
- isOK = false;
- } finally {
- return isOK;
- }
- }
- }
package com.yyhy.java.util; //多文件上传的Java端的类 import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import java.util.List; import java.util.Iterator; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.FileItem; import org.apache.log4j.Logger; import org.apache.commons.lang.ObjectUtils; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class FileUploadAction extends HttpServlet { // 限制文件的上传大小 private int maxPostSize = 100 * 1024 * 1024; //文件上传地址 private String uploadPath; public FileUploadAction() { //从配置文件中取得文件上传地址 setUploadPath(); } public String getUploadPath() { return uploadPath; } public void setUploadPath() { //从配置文件中取得文件上传地址 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); ServerAddress serverAddressBean=(ServerAddress)context.getBean("ServerAddressBean"); this.uploadPath = serverAddressBean.getUploadPath().trim(); } // 文件上传 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException { this.doUploadAdd(request, response); } private void logger(String info) { System.out.println(info); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doUploadAdd(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doUploadAdd(request, response); } private void doUploadAdd(HttpServletRequest request, HttpServletResponse response) throws ServletException { logger("begin to upload"); try { request.setCharacterEncoding("UTF-8");// 防止文件名称带有汉字后传到服务器乱码 //建立文件夹 this.makeDir(uploadPath); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } saveFiletoServer(request,response,uploadPath); } private void doUploadDelete(HttpServletRequest request,HttpServletResponse response) throws ServletException { String dirtyStr = "";//需要删除的文件名(单个文件)或文件夹名列表 try { if (request.getParameter("dirtyStr") != null) { dirtyStr=URLDecoder.decode(request.getParameter("dirtyStr"),"utf-8");//前台ENCODE,后台DECODE logger("删除的文件(夹)为:" + dirtyStr); } } catch (Exception e) { // TODO Auto-generated catch block logger(e.getMessage()); } try { new DeleteFiles().DeleteModifyFiles(dirtyStr, uploadPath); } catch (Exception e) { logger(e.getMessage()); } } //保存文件到服务器中 private void saveFiletoServer(HttpServletRequest request,HttpServletResponse response,String uploadPath) { // 操作文件 response.setContentType("text/html; charset=UTF-8"); DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024 * 4); ServletFileUpload upload = new ServletFileUpload(factory); upload.setFileSizeMax(maxPostSize); logger("request========" + ObjectUtils.toString(request)); List fileItems = null; try { fileItems = upload.parseRequest(request); logger("============" + ObjectUtils.toString(fileItems)); Iterator iter = fileItems.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); log(item.toString()); if (!item.isFormField()) { String name = item.getName(); logger("上传的文件名 = " + name); try { item.write(new File(uploadPath + name)); } catch (Exception ex) { logger(ex.getMessage()); } } } } catch (FileUploadException ex1) { logger("FileUploadException->" + ex1.getMessage()); } } // 建立文件夹路径 private boolean makeDir(String uploadPath) { boolean isOK = false; try { File file = new File(uploadPath); file.mkdirs(); isOK = true; } catch (Exception e) { isOK = false; } finally { return isOK; } } // 建立文件夹路径 private boolean makeDirs(String uploadPath, String newDocStr) { boolean isOK = false; File file; String[] temp; try { temp = newDocStr.split(","); for (int i = 0; i < temp.length; i++) { file = new File(uploadPath + temp[i] + "\\"); file.mkdirs(); } isOK = true; } catch (Exception e) { isOK = false; } finally { return isOK; } } }
Flex前台代码:
Actionscript代码
- <?xml version="1.0" encoding="utf-8"?>
- <mx:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- xmlns:mx="library://ns.adobe.com/flex/halo" layout="absolute" width="400" height="300"
- creationComplete="CreationCompletedHandler()"
- showCloseButton="true">
- <fx:Script>
- <![CDATA[
- import mx.controls.Alert;
- import mx.events.CloseEvent;
- import mx.managers.PopUpManager;
- import mx.utils.StringUtil;
-
- [Bindable]
- private var _filename:String;
-
- public function get filename():String
- {
- return _filename;
- }
-
- public function set filename(value:String):void
- {
- _filename = value;
- }
-
-
- [Bindable]
- private var _file:FileReference=new FileReference();
-
- public function get file():FileReference
- {
- return _file;
- }
-
- public function set file(value:FileReference):void
- {
- _file = value;
- }
-
-
- [Bindable]
- private var _serveraddress:String;
-
- public function get serveraddress():String
- {
- return _serveraddress;
- }
-
- public function set serveraddress(value:String):void
- {
- _serveraddress = value;
- }
-
- /**creationComplete完成之后调用,获取服务器地址,建立事件监听
- * @param null
- * @author 陈文锋 54cwf@163.com
- * @return void
- * */
- public function CreationCompletedHandler():void
- {
- Security.allowDomain("*");
- var urlLoader:URLLoader=new URLLoader(new URLRequest("assets/conf/ServerAddressConfig.xml"));
- urlLoader.addEventListener(Event.COMPLETE,CompletedHandler);
- this.addEventListener(Event.CLOSE,TitleWindowClose);
- file.addEventListener(ProgressEvent.PROGRESS,progressHandler);
- file.addEventListener(Event.SELECT,selectedHandler);
- file.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
- }
-
- private function ioErrorHandler(e:IOErrorEvent):void
- {
- Alert.show(e.toString());
- }
-
- private function progressHandler(e:ProgressEvent):void
- {
- lblProgress.text = " 已上传 " + e.bytesLoaded
- + " 字节,共 " + e.bytesTotal + " 字节";
- var proc: uint = e.bytesLoaded / e.bytesTotal * 100;
- uploadbar.setProgress(proc, 100);
- uploadbar.label= "当前进度: " + " " + proc + "%";
- }
-
- /**Event事件监听处理函数,弹出上传提示窗口
- * @param e,Event类型事件参数
- * @author 54cwf@163.com
- * @return void
- * */
- private function selectedHandler(e:Event):void
- {
- Alert.show("上传 " + file.name + " (共 "+Math.round(file.size/1024)+"KB)?",
- "确认上传",
- Alert.YES|Alert.NO,
- null,
- proceedWithUpload);
- }
-
- /**CloseEvent事件监听处理函数,访问upload的servlet服务
- * @param e,Event类型事件参数
- * @author 54cwf@163.com
- * @return void
- * */
- private function proceedWithUpload(e:CloseEvent): void{
- if (e.detail == Alert.YES)
- {
- filename=file.name;
- var request:URLRequest = new URLRequest(StringUtil.trim(serveraddress));
- try
- {
- file.upload(request);
- }
- catch (error:Error)
- {
- Alert.show("上传失败","错误");
- }
-
- }
- }
-
- private function upload(): void{
- var typefiter:FileFilter=new FileFilter("Excel","*.xls");
- file.browse([typefiter]);
- }
-
- /**CloseEvent事件监听处理函数,关闭TitleWindow弹出窗口
- * @param e,事件参数
- * @author 54cwf@163.com
- * @return void
- * */
- private function TitleWindowClose(e:CloseEvent):void
- {
- PopUpManager.removePopUp(this);
- }
-
- /**Event事件监听处理函数,获取配置文件的文件上传路径
- * @param e,事件参数
- * @author 54cwf@163.com
- * @return void
- * */
- private function CompletedHandler(e:Event):void
- {
- var configurationxml:XML=XML((URLLoader(e.target).data));
- serveraddress=configurationxml.filesinservername;
- }
- ]]>
- </fx:Script>
- <mx:Canvas width="100%" height="100%">
- <mx:VBox width="100%" horizontalAlign="center">
- <mx:Label id="lblProgress" text="上传"/>
- <mx:ProgressBar id="uploadbar" labelPlacement="bottom" themeColor="#F20D7A"
- minimum="0" visible="true" maximum="100" label="当前进度: 0%"
- direction="right" mode="manual" width="200"/>
- <mx:Button label="上传文件" click="upload()"/>
- </mx:VBox>
- </mx:Canvas>
- </mx:TitleWindow>