我们知道Flex对于本地的限制比AIR要大,当我们想保存一个由Flex生成的文件必须借由服务器来完成,现在有一个需求就是,用户想保存Flex生成的图片在本地,我们要完成这个过程,必须先将Flex生成的图片转换为通用的数据格式,即ByteArray,然后由后台程序帮助写文件,形式上类似先上传,再下载,只不过中间不用保存实际的物理文件。 好了废话这么多把代码贴上来吧 Flex端
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.graphics.codec.JPEGEncoder; import mx.graphics.ImageSnapshot; private function saveAs(){ var en:JPEGEncoder = new JPEGEncoder(100); //压缩图片,100是指质量 var ba:ByteArray=en.encode(ImageSnapshot.captureBitmapData(img));//将控件转为BitmapData后再转 为ByteArray var request:URLRequest = new URLRequest("/TestForLCDS/servlet/UploadServlet"); request.method="POST"; request.data=ba; request.contentType = "application/octet-stream"; //这个很重要,设置成流数据 navigateToURL(request,"_blank"); //因为要浏览器触发下载事件,所以就不用异步方式打开连接了 } ]]> </mx:Script> <mx:Button x="228" y="10" label="另存为本地图片" click="saveAs()"/> <mx:Image id="img" x="10" y="10" source="img.jpg" width="200" height="200" scaleContent="false"/> </mx:Application>后台Java servlet
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/x-download"); //内容是下载 response.setHeader("Content-Disposition","attachment;filename=" + "test.jpg");//文件名,可以进一步 处理 //读数据 BufferedInputStream inputStream = new BufferedInputStream(request.getInputStream()); OutputStream outputStream = response.getOutputStream(); byte [] bytes = new byte[1024]; int v; //写数据 while((v=inputStream.read(bytes))>0){ outputStream.write(bytes,0,v); } outputStream.flush(); outputStream.close(); inputStream.close(); } 相关资源:flex 实现图片另存为