我们知道Flex对于本地的限制比AIR要大,当我们想保存一个由Flex生成的文件必须借 由服务器来完成,现在有一个需求就是,用户想保存Flex生成的图片在本地,我们要完成这个过程,必须先将Flex生成的图片转换为通用的数据格式,即 ByteArray,然后由后台程序帮助写文件,形式上类似先上传,再下载,只不过中间不用保存实际的物理文件。
好了废话这么多把代码贴上来吧
Flex端
CODE:
:
<?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
CODE:
:
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();
}
}