Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.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
Apache flex 将图像字节放入字符串不起作用?_Apache Flex_Actionscript 3 - Fatal编程技术网

Apache flex 将图像字节放入字符串不起作用?

Apache flex 将图像字节放入字符串不起作用?,apache-flex,actionscript-3,Apache Flex,Actionscript 3,我尝试了Flex3,面对上传JPG/PNG图像的问题,trace readUTFBytes将返回正确的字节长度,但tmpFileContent是结构化的,它似乎只通过PHP脚本将3个字符的数据上传到服务器,这使得图像无法使用。我没有非图像格式的问题。这里怎么了 var tmpFileContent:String = fileRef.data.readUTFBytes(fileRef.data.length); 字符串是否能够处理字节?我不确定您希望如何处理该图像,但您可能希望阅读以下内容: 您

我尝试了Flex3,面对上传JPG/PNG图像的问题,trace readUTFBytes将返回正确的字节长度,但tmpFileContent是结构化的,它似乎只通过PHP脚本将3个字符的数据上传到服务器,这使得图像无法使用。我没有非图像格式的问题。这里怎么了

var tmpFileContent:String = fileRef.data.readUTFBytes(fileRef.data.length);

字符串是否能够处理字节?

我不确定您希望如何处理该图像,但您可能希望阅读以下内容:


您可能还需要图像编码器,如JPEG编码器:

您可以始终使用base64进行编码:

var enc:Base64Encoder = new Base64Encoder();
enc.encodeBytes(fileRef.data);
var base64data:String = enc.drain();

本教程中使用的方法对于文本文件以外的任何文件都不安全。任意二进制格式可能包含零。在许多语言/平台中,值为0的字节通常被视为字符串终止符。Actionscript中也是如此,如下代码所示:

var str:String = "abc\x00def";
trace(str);
$str = "a\x00b";

var_dump(ord($str{0}));     //  97
var_dump(ord($str{1}));     //  0
var_dump(ord($str{2}));     //  98
该字符串将被截断为abc,因为0x00被视为标记字符串的结尾

我认为您最好的选择是按照maclema的建议将内容编码到64位。在编写文件之前,从php端对其进行解码,如下所示:

file_put_contents($myFilePath, base64_decode($fileData["filedata"]));
另外,我不记得文件内容是否是二进制安全的,我想不是。如果是这种情况,您应该使用fopen'you_path',wb,fwrite和fclose来编写文件。注意wb中的b,它代表二进制。例如,如果不传递该标志,您可能会在某些字符换行符和回车符方面遇到问题

增加:

也许,根据davr的建议,您可以尝试通过teArray发送数据,以查看AMFPHP是否正确处理了数据

Php确实允许字符串中使用embbednul,如下代码所示:

var str:String = "abc\x00def";
trace(str);
$str = "a\x00b";

var_dump(ord($str{0}));     //  97
var_dump(ord($str{1}));     //  0
var_dump(ord($str{2}));     //  98
因此,如果AMFPHP将bytearray转换为字符串,并且在转换过程中不会损坏它,那么这实际上是可行的

// method saves files on the server
function uploadFiles($fileData) {
    // new file path an name
    // to not overwrite the files we add the microtime before the file name 
    $myFilePath = '../../_uploads/'.
        preg_replace("/[^0-9]+/","_",microtime()).'_'.$fileData["filename"];
    // writing on the disk
    $fp = fopen($myFilePath,"wb");
    if($fp) {
        fwrite($fp,$fileData["filedata"]);
        fclose($fp);
    }
    // returning response - is not used anywhere 
    return true;
} 

否则,请尝试回显var_dump$fileData['fileData'],查看AMFPHP将数据转换为的实际类型,可能它使用了数组,但不确定;考虑到字符串在php中的工作方式很像单字节字符的缓冲区,我认为它可能只是使用字符串。

我不知道操作脚本,但如果您可以使用readUTFBytes将图像加载到字符串中,我会感到惊讶。图像包含二进制数据,可能不是有效的utf8字符串。你能改用字节数组吗?你想对数据做什么?我在本教程中修改了Flex 3的代码,所以除了图像格式外,我可以在没有任何问题的情况下上传。这让我想知道readutfbytes是如何在Flex4中工作的?请提供您用于生成数据和上载数据的完整源代码。在这个问题上,我们不能给出很好的建议,而不知道你到底做错了什么。我能想到的唯一一件事是UTF用于文本,而不是二进制。除非您希望更改后端代码以读取原始输入,这样您就可以直接发布bytearray。直接发布数据将更加高效。不需要在flash中花费时间编码到base64,并且将使用更少的带宽。@davr。大概可以说,发送原始数据会更快。而且,是的,您将使用更多的带宽:正好是原始文件大小的三分之一。但我已经做到了,让我告诉你,它工作得很好,即使有大文件。因此,除非有实际的性能问题,特别是因为OP似乎已经设置好了,使用AMFPHP和其他工具,只需添加几行Actionscript和php,就可以让已经设置好的系统为图像文件工作。@davr。虽然如果php端读取AMFPHP可以透明、安全地处理对象作为原始字节而不是字符串的接收,但我真的不知道,实际上您可以直接从as发送bytearray,并在必要时更改文件内容,抛开Base64编码/解码模式,PHP确实可以做到这一点,它是专门为使用Adobe的AMF协议从flash接收数据而设计的。例如: