二进制模式写作

时间:2011-11-20 11:01:40

标签: php binary

我正在编写一个php程序来编写二进制文件(可能是视频或图像文件)。我想将它作为一个Web服务,并从另一个应用程序,如c#,mac等。

我的代码在下面给出,

<?php
$fileChunk = $_POST["filechunk"];
$vodFolder = 'D:\\HYSA SVN\\Trunk\\workproducts\\source\\hysa_he\\web\\entertainment\\';
$vodFile = $vodFolder . "abcd.mov";
$fh = fopen($vodFile, 'ab');

flock ($fh, LOCK_EX);
$varsize = fwrite($fh, $fileChunk);
fclose($fh);
?>

但是当我从c#代码调用php web服务时,abcd.mov正在该位置创建,但它的大小只有一个kb。我怀疑,当在二进制文件中找到一个字符'&amp;'时,写入停止了。我阅读了php文档,发现用二进制模式'b'fopen会解决这个问题吗?但它没有用。有人可以帮帮我吗?

这是我的c#代码。

BinaryReader b = new BinaryReader(File.Open("d:\\image38kb.jpg", FileMode.Open));
int pos = 0;
int length = (int)b.BaseStream.Length;
byte[] bt = b.ReadBytes(length);

char[] ch = b.ReadChars(length);


HttpWebRequest request = null;
Uri uri = new Uri("http://d0327/streamtest.php");
request = (HttpWebRequest)WebRequest.Create(uri);
NetworkCredential obj = new NetworkCredential("shihab.kb",
            "India456*", "tvm");
request.Proxy.Credentials = obj;

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = bt.Length;
using (Stream writeStream = request.GetRequestStream())
{
UTF8Encoding encoding = new UTF8Encoding();
byte[] bytes = encoding.GetBytes("filechunk=");
byte[] rv = new byte[bytes.Length + bt.Length];

System.Buffer.BlockCopy(bytes, 0, rv, 0, bytes.Length);
System.Buffer.BlockCopy(bt, 0, rv, bytes.Length, bt.Length);

writeStream.Write(rv, 0, bt.Length);
}

string result = string.Empty;
using (
HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
    using (StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8))
    {
    result = readStream.ReadToEnd();
    }
}
}

1 个答案:

答案 0 :(得分:0)

问题不在fwrite部分,工作正常。

但是,HTTP中的POST请求如下所示:

POST /somepage.php HTTP/1.1
Content-Length: 34

variable1=blah&var2=something else

正如您所看到的,变量除以&符号(&amp;)(以及键 - 值映射的等号(=))...因此,即使使用POST请求,“&”也不是安全字符。

要解决此问题,您可以尝试其他传输方法,例如TCP / IP套接字连接,或者简单地使用'\ x26'(&符号的ASCII值)转义&符号并转义所有反斜杠(\)使用'\ x5C'...您必须编辑PHP代码来解析这些值。