Google Gears ve ASP.NET veya PHP kullanarak dosya upload

1 Cevap php

Google Gears ve ASP.NET kullanarak dosyaları yüklemek için çalışıyorum ... Sana HttpRequest API lekeler kabul eder gibi can varsayalım.

Ben sayfasında denetimi FileUpload var.

<asp:FileUpload runat="server" ID="File1" />

Daha sonra JavaScript

var file1 = document.getElementById("<%# File1.ClientID %>");
var desktop = google.gears.factory.create('beta.desktop');

file1.onclick = function()
{
    desktop.openFiles(openFilesCallback,
        {
            singleFile: true,
            filter: ["image/jpeg"]
        }
    );
    return false;
}

function openFilesCallback(files)
{
    if(files.length == 0)
    {
    	alert("No files selected");
    }
    else
    {
    	// 1MB = 1024 * 1024 bytes
    	if(files[0].blob.length > (1024 * 1024)) 
    	{
    		alert("File '" + files[0].name + "' is too big to upload");
    	}
    	else
    	{
    		uploadFile(files[0]);
    	}
    }
}

function uploadFile(file)
{
    var up = google.gears.factory.create("beta.httprequest");
    up.open("POST", "upload.ashx");
    up.send(file.blob);
}

Ancak, işleyici nasıl ele emin değilim.

public void ProcessRequest (HttpContext ctx)
{
    ctx.Response.ContentType = "text/plain";
    ctx.Response.Write("Hello World");
    ctx.Response.Write(ctx.Request.Files.Count.ToString());
    ctx.Response.Write(ctx.Request.Form.Count.ToString());
}

Ben son iki tabloların birinin üzerine bir kesme noktası ayarlarsanız, hem Files.Count ve Form.Count return 0 Ben kundakçı bir istisna alamadım:. {[(2)] }

Ben Gears üzerinden upload POST kullanamıyorsanız, PUT kullanarak yapılabilir?

Edit: PHP Code will be fine as well (since I want to do it in both languages)

1 Cevap

Senin sorunun kök dişliler senin aslında multipart-form/data yükleme mekanizmasını kullanarak değil, bunun yerine senin aslında POST isteği kendisi dosya veri gönderme olduğunu düşünüyorum.

Peki ne yapmak gerekir, giriş işleyicisi istek akışını okumak ve veri kapmak aslında. Kodunuzu aşağıdaki gibi görünmelidir:

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);
    }
}

Tabii ki bir dosyaya yazmak veya bir veritabanı size kalmış yanı sıra, istisna durumları ve üzerinde kod beri, yeni bir dosya oluşturmak veya Ayrıca varolan bir dosyayı, vb eklemek isteyip istemediğinizi bulmaktan 1MB sınırı olsun dosya boyutu, ben tampon uzunluğunu sınırlamak için rahatsız etmedi. Senin potansiyel olarak çok büyük bloklar ile ilgili eğer (bu akış uzunluğu> int.MaxValue, yani muhtemelen olası değildi durumda olacağını veri tükendi kadar küçük bir tampon almak ve parçalar akışından okumak gerekebilir .)

Eğer orijinal dosyanın adı gibi şeyler eklemek için gerekiyorsa bir kaç seçenek var. Bir sadece (emin düzgün kodlanmış bulunuyor yapmak) bir sorgu parametresi olarak URL ile göndermek. Sonra ctx.Request.QueryString ["dosyaİsmi"] ya da böyle onu okuyabilirsiniz.

Başka bir seçenek istemci tarafında daha karmaşık bir nesne içine ihtiyacınız veri koymak için, ve sonra tüm seri ve POST koymak için JSON kullanmak istiyorsunuz. Yani istemci kodu gibi bir şey olacaktır:

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));
}

Sunucu tarafında bu serisini gerekir, bu yüzden büyük olasılıkla System.Web.Services gelen DataContractJsonSerializer gerekir. Başka bir seçenek James Newton-King Json.Net kütüphane olurdu (http://james.newtonking.com/pages/json-net.aspx).

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);
    }
}

Ben PHP arazi oldum beri ben PHP tarafında çok yardımcı olamaz korkuyorum .... Bu uzun, uzun, uzun zaman oldu :)