4

私はかなり長い間、Android デバイスにダウンロードできる ASP.NET (C#) を使用して vCard を生成しようと試みてきました。

カードの生成プロセスは非常に簡単なので、あまり心配する必要はありません。仕事に取り掛からないのはダウンロードそのものです。

vCard をページ応答に添付するコードは次のようになります。

public void downloadCard()
{
    //generate the vCard text
    string vCard = generateCard();

    //create the filename the user will download the file as
    string filename = HttpUtility.UrlEncode(username + ".vcf", System.Text.Encoding.UTF8);

    //get a reference to the response
    HttpResponse response = HttpContext.Current.Response;

    //clear the response and write our own one.
    response.Clear();
    response.ContentType = "text/x-vcard";
    response.AddHeader("Content-Disposition", "attachment; filename=" + filename + ";");
    response.Write(vCard);
    response.End();
}

web.config ファイルでの URL の書き換えのおかげで、ページが受け取る唯一のパラメーターは、R​​ESFUL URL を介して受信したユーザー名用ですが、それほど重要ではないため、生成プロセスをわざわざ表示することはしません。したがって、URL example.com/vcard/apbarratt は、ユーザー apbarratt の vCard を生成します。

このコードに対して GET 要求が生成する応答は、次のようになります。

200 OK
Date: Wed, 15 Aug 2012 13:49:56 GMT
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Content-Disposition: attachment; filename=apbarratt.vcf;
Content-Length: 199
Server: Microsoft-IIS/7.5
Content-Type: text/x-vcard; charset=utf-8
Cache-Control: private
BEGIN:VCARD
VERSION:2.1
N;LANGUAGE=en-us:Andy Barratt
FN:Andy Barratt
TEL;CELL;VOICE:07000000000
URL;WORK:http://example.com
EMAIL;INTERNET:apbarratt@example.com
END:VCARD

これは、Android ストック ブラウザーを除いて、私がテストしたすべてのブラウザーで完全に機能します (iOS ではなく、別の方法で解決された別の問題です)。これらのブラウザーでは、ファイル名が「不明」で「失敗」という用語でダウンロードが失敗するか、他のデバイスではユーザー名が「apbarratt.vcf」で「進行中」という用語が変化しないように見えます。

この問題は、opera mobile/mini などの他のブラウザでは問題ありません。

私は考えられる限りのことをすべて試しました。似たような問題について非常に多くのブログを読んで、すべてについて夢を見ています...それらは本当に退屈です...

とにかく、うまくいけば、いくつかの新鮮な目が私を助けることができるでしょう. おそらく、誰かが以前にこれを行ったことがあり、コードを共有して、助けを期待しています.

アンディ

4

2 に答える 2

1

私もまったく同じ問題を抱えていました。標準の Droid Safari ブラウザ以外はすべて動作しているように見えました。私の解決策は、ファイルをテキストとして読み取り、それを ASCII バイトに変換することでした。コードを変更すると、Droids (2.3 および 3.2) は満足しているように見えました。

コード スニペットを次に示します (私の MVC ベースのプロジェクトから)。

public ActionResult GetContact()
{
    Response.Clear();
    Response.AddHeader("Content-disposition", string.Format("attachment; filename=\"{0}\";", "MyContact.vcf"));

               //  VERY IMPORTANT!!!

               //      Read the file as text, and then convert it to ASCII bytes.  
               //      If ReadAllBytes is used, extra stray characters seem to appear and DROID fails.

               //      Put the content type in the second parameter!!!


    var vCardFile = System.IO.File.ReadAllText(Server.MapPath("~/Contacts/MyContact.vcf"));
    return File(System.Text.Encoding.ASCII.GetBytes(vCardFile), "text/x-vcard");
}

お役に立てれば...

乾杯。

于 2013-06-18T19:58:18.990 に答える
0

解決したかどうかはわかりませんが、同じ問題が発生しました。障害の1つは、Nフィールドに5つの値があると予想されるため、最後にセミコロンを追加する必要があるということでした。 (あなたの例ではそれらのうちの4つ)、またはしたがって:

N;LANGUAGE=en-us:Barratt;Andy;;;

もう1つは、コンテンツタイプをtext / vcardに設定する方がよいということです。これは、現在の標準です。

于 2012-10-03T18:24:39.433 に答える