使用Google Gears和ASP.NET或PHP上载文件

使用Google Gears和ASP.NET或PHP上载文件,php,asp.net,upload,httphandler,google-gears,Php,Asp.net,Upload,Httphandler,Google Gears,正在尝试使用Google Gears和ASP.NET上载文件。。。我想你可以接受这些斑点 我在页面中有FileUpload控件 <asp:FileUpload runat="server" ID="File1" /> 如果在最后两条语句中的任意一条上设置断点,则Files.Count和Form.Count都返回0。如果没有,我会在Firebug中得到一个异常:组件返回故障代码:0x80004001(NS\u错误\u未实现) 如果我不能使用POST通过Gears上传,可以使用PUT吗

正在尝试使用Google Gears和ASP.NET上载文件。。。我想你可以接受这些斑点

我在页面中有FileUpload控件

<asp:FileUpload runat="server" ID="File1" />
如果在最后两条语句中的任意一条上设置断点,则
Files.Count
Form.Count
都返回0。如果没有,我会在Firebug中得到一个异常:
组件返回故障代码:0x80004001(NS\u错误\u未实现)

如果我不能使用POST通过Gears上传,可以使用PUT吗

编辑:
PHP代码也很好(因为我想用两种语言编写)

我认为问题的根源在于gears没有实际使用多部分表单/数据上传机制,而是在POST请求中实际发送文件数据

因此,您需要做的实际上是从输入处理程序读取请求流,并获取数据。您的代码应该如下所示:

public void ProcessRequest (HttpContext ctx)
{
    var filePath = "SomePath/ToWrite/Filedata.dat";
    var stream = ctx.Request.InputStream;
    var buffer = new byte[stream.Length];
    stream.Read(buffer,0,buffer.Lenght);
    using(var fileStream = new FileStream(filePath,FileMode.Create))
    {
        fileStream.Write(buffer, 0, buffer.Length);
    }
}
当然,是写入文件还是写入数据库取决于您,以及异常处理和确定是否要创建新文件或附加现有文件等。此外,由于您的代码对文件大小有1MB限制,我没有费心限制缓冲区长度。如果您可能要处理非常大的块,您可能需要选择一个较小的缓冲区并从流中分块读取,直到数据用完为止(这适用于流长度>int.maxvalue的情况,因此可能不太可能)

如果需要包括原始文件名之类的内容,您有几个选项。一种是将URL作为查询参数发送(确保正确编码)。然后您可以从ctx.Request.QueryString[“fileName”]或类似的文件读取它

另一种选择是将您需要的数据放入客户端上更复杂的对象中,然后使用JSON对其进行序列化并将其放入POST中。因此,您的客户端代码看起来像:

function uploadFile(file)
{
    var up = google.gears.factory.create("beta.httprequest");
    up.open("POST", "upload.ashx");
    var fileInfo = { Name: file.name, Data: file.blob, someOtherData: ...};
    up.send(JSON.stringify(fileInfo));
}
您需要在服务器端对其进行反序列化,因此很可能需要System.Web.Services中的DataContractJsonSerializer。另一个选项是James Newton King()提供的Json.Net库

恐怕我在PHP方面帮不了什么忙……我在PHP领域已经很久很久很久了:)

谢谢,这似乎奏效了(它已经在使用多部分表单/数据,所以这不是问题)。虽然我没有使用JSON和反序列化数据,而是为附加元数据设置请求头。
public void ProcessRequest (HttpContext ctx)
{
    var filePath = "SomePath/ToWrite/Filedata.dat";
    var stream = ctx.Request.InputStream;
    var buffer = new byte[stream.Length];
    stream.Read(buffer,0,buffer.Lenght);
    using(var fileStream = new FileStream(filePath,FileMode.Create))
    {
        fileStream.Write(buffer, 0, buffer.Length);
    }
}
function uploadFile(file)
{
    var up = google.gears.factory.create("beta.httprequest");
    up.open("POST", "upload.ashx");
    var fileInfo = { Name: file.name, Data: file.blob, someOtherData: ...};
    up.send(JSON.stringify(fileInfo));
}
internal class FileInfo
{
    public string Name { get; set; }
    public byte[] Data { get; set; }
    // .. some other data
}


public void ProcessRequest(HttpContext ctx)
{
    var serializer = new DataContractJsonSerializer(typeof(FileInfo));
    FileInfo fInfo = (FileInfo)serializer.ReadObject(ctx.Request.InputStream);
    var path = basePath + fInfo.Name;
    using(var fileStream = new FileStream(path,FileMode.Create))
    {
        fileStream.Write(fInfo.Data,0,fInfo.Data.Length);
    }
}