Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将二进制文件从actionScript发送到.net?_C#_Asp.net_Actionscript 3_Flash_Apache Flex - Fatal编程技术网

C# 如何将二进制文件从actionScript发送到.net?

C# 如何将二进制文件从actionScript发送到.net?,c#,asp.net,actionscript-3,flash,apache-flex,C#,Asp.net,Actionscript 3,Flash,Apache Flex,我有一个flex程序(AS3/Flash),允许用户创建舞台部分的PNG图像并通过电子邮件发送。这很有效 我想拍摄相同的图像并将其发送到剪贴板,但这不起作用。因此,下一个最好的方法是允许他们将其发送到浏览器,在那里他们可以将其保存到文件中 这是我用来做这件事的代码 bmpPanelData.draw(uiPrintObject) var baPanel:ByteArray = PNGEnc.encode(bmpPanelData); // Cli

我有一个flex程序(AS3/Flash),允许用户创建舞台部分的PNG图像并通过电子邮件发送。这很有效

我想拍摄相同的图像并将其发送到剪贴板,但这不起作用。因此,下一个最好的方法是允许他们将其发送到浏览器,在那里他们可以将其保存到文件中

这是我用来做这件事的代码

            bmpPanelData.draw(uiPrintObject)
        var baPanel:ByteArray = PNGEnc.encode(bmpPanelData);
//      Clipboard.generalClipboard.clear();
//      var bolClipboard:Boolean = Clipboard.generalClipboard.setData(ClipboardFormats.BITMAP_FORMAT, baPanel, true);
//      trace('bolClipboard=' + bolClipboard);

            var strFileName:String = strPrintObject;
            var strFileExt:String = "png"
            var variables:URLVariables = new URLVariables(); 
            variables.mimeType = "application/octet-stream";
            variables.fileExt = strFileExt;
            baPanel.position = 0;
            var strPanel:String = getBytes(baPanel);
//          var strPanel:String = baPanel.readMultiByte(baPanel.bytesAvailable,"latin1");
            variables.fileContents = escape(strPanel);
            trace('strPanel.length=' + strPanel.length + ' baPanel.length=' + baPanel.length);
            variables.disposition = "Attachment";
            variables.fileName = strFileName;
            var u:URLRequest = new URLRequest( RootDomain + "SendBinaryFile2.aspx");
            u.data = variables; 
            u.method = "POST"; 
            navigateToURL(u,"_blank"); 
    }
    catch (err:Error)
    {
        Alert.show("This Panel cannot be copied to the clipboard. \nSorry for the inconvenience \nError: " + err.errorID,"E-mail not premitted",Alert.OK)
    }
(我把剪贴板上的东西注释掉了,以防有人知道怎么做。我的理解是,你不能从Flash向剪贴板发送二进制数据,但它可以在空中工作。)

因为我找不到AS3方法将二进制ByteArray转换为字符串,所以我编写了自己的getBytes。如果您知道AS3中的方法,请告诉我

    private function getBytes(baArray:ByteArray):String
{
    var strOut:String = "";
    baArray.position = 0;
    var intBASize:int = baArray.bytesAvailable;
    for (var i:int = 0;i < intBASize;i++)
    {
        strOut += String.fromCharCode(baArray.readByte()); 
    }
    return strOut;
}
私有函数getBytes(baArray:ByteArray):字符串
{
var strOut:String=“”;
baArray.position=0;
var intBASize:int=baArray.bytesavable;
for(变量i:int=0;i
在ASPX端,我有一个名为SendBinaryFile2.ASPX的文件,看起来像这样

<%@ Page Language="C#" validateRequest="false"%>
<script Runat="Server">

void Page_Load(Object sender, EventArgs e)
{
    string fileExt = Request.Form["fileExt"];
    string mimeType = Request.Form["mimeType"];
    string disposition = Request.Form["disposition"];
    string fileName = Request.Form["fileName"];
    byte [] fileContents = Encoding.ASCII.GetBytes(HttpUtility.UrlDecode(Request.Form["fileContents"]));

    Response.Buffer = true;
    Response.Clear();
    Response.AddHeader("Content-Length", fileContents.Length.ToString());
    Response.ContentType = mimeType;
    Response.AddHeader("Content-Disposition", disposition + "; filename=" + fileName + "." + fileExt);
    Response.BinaryWrite(fileContents);
    Response.Flush();
    Response.Close();
    Response.End();
}
</script>

无效页面加载(对象发送方,事件参数e)
{
字符串fileExt=Request.Form[“fileExt”];
字符串mimeType=Request.Form[“mimeType”];
string disposition=Request.Form[“disposition”];
字符串fileName=Request.Form[“fileName”];
byte[]fileContents=Encoding.ASCII.GetBytes(HttpUtility.UrlDecode(Request.Form[“fileContents”]);
Response.Buffer=true;
Response.Clear();
AddHeader(“Content-Length”,fileContents.Length.ToString());
Response.ContentType=mimeType;
AddHeader(“内容处置”,处置+”;filename=“+filename+””+fileExt);
BinaryWrite(文件内容);
Response.Flush();
Response.Close();
Response.End();
}
结果是一个看起来非常像.PNG文件的文件,但打开时已损坏。我已经直观地比较了通过电子邮件发送的文件和使用VIM通过这个程序发送的文件,它们看起来相似,字符数大致相同,以相似的字符开始/结束


非常感谢您对上述任何一项的帮助。

请在您的
getBytes
函数中尝试此功能

private function getBytes (baArray:ByteArray) : String
{
    var strOut:String = ""; var strRead:String = "";
    baArray.position = 0;
    var intBASize:uint = baArray.length;

    for (var i:int = 0; i < intBASize; i++)
    {
        strRead = baArray.readUnsignedByte().toString(16); 

        if(strRead.length < 2) { strRead = "0" + strRead; } //# do padding
        strOut += strRead ;     
    }

    return strOut.toUpperCase();
}
私有函数getBytes(baArray:ByteArray):字符串
{
var strOut:String=“”;var stread:String=“”;
baArray.position=0;
var intBASize:uint=baArray.length;
for(变量i:int=0;i

这将为您提供填充字节。考虑<代码> X0FF3仅是<代码> XFF3没有填充,稍后另一方可以假设字节确实是代码> XFF30导致损坏的图像。

< P>我建议您使用Base64编码来传输二进制数据。无论如何,您必须已经需要使用它来编码您的电子邮件附件

动作脚本:

c#:

此外,如果您的SWF作为独立的AIR运行(您编写了“Flex程序”…),则可以直接将文件保存到任何位置,并向用户发出“另存为…”提示

要从空气中保存的源:

var bmpd:BitmapData = new BitmapData(myWidth, myHeight, true, 0);
bmpd.draw(mySource);
var imgByteArray:ByteArray = new PNGEncoder().encode(bmpd);
var fl:File = File.desktopDirectory.resolvePath("myImage.png");
var fs:FileStream = new FileStream();
fs.open(fl, FileMode.WRITE);
fs.writeBytes(imgByteArray);
fs.close();

您可以尝试转换为base64字符串。查看更多:我希望我的答案有帮助,但为什么发送到浏览器只是为了保存文件?我的意思是你可以使用
FileReference
class.VC直接在AS3中保存一个文件。我以前从未用过这个,但它似乎正是我所需要的。如果有人需要,我可以让它以另一种方式工作,并提供我的结果。很高兴它被分类了。是的,只需使用fileReference保存
baPanel
(PNG编码后)即可获得磁盘上的图像。减少麻烦?。PS:使用@symbol向用户发出通知,否则我会错过你的评论。ThanksVC.One这将返回一个包含字符串十六进制值的字符串,而不是实际的二进制字符串。我假设我将从“variables.fileContents=escape(strPanel);”行中删除“escape”。我在C端使用什么来将十六进制字符字符串转换为实际的二进制数据?是否希望格式为“0&1”而不是十六进制?让我知道,因为该格式的填充代码不同。如果将其保留为十六进制,则在将其复制到剪贴板之前对其进行base64编码,然后浏览器可以将base64解码为可显示的图像。
var bmpd:BitmapData = new BitmapData(myWidth, myHeight, true, 0);
bmpd.draw(mySource);
var imgByteArray:ByteArray = new PNGEncoder().encode(bmpd);
var fl:File = File.desktopDirectory.resolvePath("myImage.png");
var fs:FileStream = new FileStream();
fs.open(fl, FileMode.WRITE);
fs.writeBytes(imgByteArray);
fs.close();