2009-08-18 13 views
4

ベンダー製品バックエンドへのファイル転送操作をサポートするWebアプリケーションプロジェクトがあります。これは、IIS 6.0でWin2003のサーバー上のウェブサイトにコンパイル2つのHTTPHandlerのファイルで構成されます:WebフォームのページからHTTPHandler.ashxファイルにデータを投稿するにはどうすればいいですか?

  • UploadHandler.ashx

は、これらのファイルは、ColdFusionのWebサイトから "に投稿された" GET DownloadHandler.ashx

  • ユーザーインターフェイスを公開します。ある意味では、これらのハンドラが動作し、ColdFusionから呼び出される必要があるため、私の仕事は完了しています。

    しかし、自分のテスト用UI(default.aspx)をColdFusionとは独立したテスト/リファインメントで使用することができないというのは非常に不満です。ダウンロードのためにPostBackUrlを使用して

    <asp:Button ID="DownloadButton" PostBackUrl="~/DownloadHandler.ashx" runat="server" Text="Download"/> 
    

    はうまく動作 - DownloadHandler.ashxが入力されると、それはcontext.Request.Form [「txtRecordNumber」]にそのキー入力値を検索します。

    しかし、私はいくつかの処理をしなければならないので、私はアップロードのために、この技術を使用することはできません私のUploadHandler.ashxファイルがリクエストから入力を得ることができますので(何とかFORM変数に選ばれたfileupload1.postedfileからバイトをお読みください。フォームはダウンロードと同じように)

    My first approach tried using HTTPWebRequestこれはあまりにも複雑に思えました。私は決して仕事をすることができませんでした。症状はHTTP 401のステータスコードで始まり、次に302のステータスコードに変わったので、私は他のアイデアを研究しました。ここで

    は私のdefault.aspxから私の最新のコードスニペットです:エラーで私の.ashxファイルの結果にServer.Transferを(上記)を使用する

    protected void UploadHandlerButton_Click(object sender, EventArgs e) 
    { 
        if (FileUpload1.HasFile) 
        { 
         try 
         { 
          BuildFormData(); 
          //Server.Transfer("UploadHandler.ashx", true); 
          Response.Redirect("~/UploadHandler.ashx"); 
         } 
         catch (Exception someError) 
         { 
          LogText("FAILURE: " + someError.Message); 
         } 
        } 
    } 
    protected void BuildFormData() 
    { 
        BinaryReader b = new BinaryReader(FileUpload1.PostedFile.InputStream); 
        int numBytes = FileUpload1.PostedFile.ContentLength; 
        byte[] fileContent = b.ReadBytes(numBytes); 
        objBinaryData.Text = System.Text.Encoding.UTF8.GetString(fileContent); 
        b64fileName.Text = FileUpload1.PostedFile.FileName; 
        // create arbitrary MetaData in a string 
        strMetaData.Text = "recAuthorLoc=anyname1~udf:OPEAnalyst=anyname2~udf:Grant Number=0102030405"; 
    } 
    

    試み:UploadHandlerため エラーを実行子のリクエスト.ashx GET(ないPOST)で私の.ashxファイルの結果にResponse.Redirectを(上記)を使用する

    試みをし、それがあまりにも間違っているようですので、当然のTrace.axdはFormコレクションで何も表示されません。

    私もクローン-INGの私の.ashxファイルを試してみましたが、UploadPage.aspx(無HTML要素を持つWebフォーム)を作成してみました:

    Server.Transfer("UploadPage.aspx", true); 
    //Response.Redirect("~/UploadPage.aspx"); 
    

    それらのどちらもが、私は必要なフォームデータを参照することができます私のコード内で、アップロードリクエストを処理するRequest.Formで見ることができます。私は明らかにここに何かを逃しています...助けてあげてあげてあげてください

    EDIT-UPDATE: 私の問題を明確にすることができると思います。 ColdFusionからUploadHandler.ashxが送信されると、必要なすべての入力がFORMコレクションで利用できます(例えばRequest.Form ["fileData"]など)

    コントロールを使用すると、私の起動Webページ(つまりdefault.aspx)へのポストバック。これにより、FileUpload1を使用してコンテンツを参照することができます。以下のようにPostedFile

    protected void BuildFormData() 
    { 
        BinaryReader b = new BinaryReader(FileUpload1.PostedFile.InputStream); 
        int numBytes = FileUpload1.PostedFile.ContentLength; 
        byte[] fileContent = b.ReadBytes(numBytes); 
        objBinaryData.Text = System.Text.Encoding.UTF8.GetString(fileContent); 
        b64fileName.Text = FileUpload1.PostedFile.FileName; 
    } 
    

    しかし、私は自分のWebサーバー上のどこかにファイルを保存するためにFileUpload1.PostedFile.SaveAs方法を使用していません。 「再ポスト」全く別のファイルにこのデータは - - つまり、私のUploadHandler.ashxハンドラここで言語を許して - 私が何とかする必要があります。上記で試したばかげたテクニックはすべて、私が必要とするものを達成するのに失敗します。

    EDIT-UPDATE(2009年8月20日) - Javascriptを使用して、私の最終的な解決策:

    protected void UploadHandlerButton_Click(object sender, EventArgs e) 
    { 
        if (FileUpload1.HasFile) 
        { 
         try 
         { 
          ctlForm.Text = BuildFormData(); 
          String strJS = InjectJS("_xclick"); 
          ctlPostScript.Text = strJS; 
         } 
         catch (Exception someError) 
         { 
          LogText("FAILURE: " + someError.Message); 
         } 
        } 
    } 
    private String InjectJS(String strFormId) 
    { 
        StringBuilder strScript = new StringBuilder(); 
        strScript.Append("<script language='javascript'>"); 
        strScript.Append("var ctlForm1 = document.forms.namedItem('{0}');"); 
        strScript.Append("ctlForm1.submit();"); 
        strScript.Append("</script>"); 
        return String.Format(strScript.ToString(), strFormId); 
    } 
    protected string BuildFormData() 
    { 
        BinaryReader b = new BinaryReader(FileUpload1.PostedFile.InputStream); 
        int numBytes = FileUpload1.PostedFile.ContentLength; 
        byte[] fileContent = b.ReadBytes(numBytes); 
        // Convert the binary input into Base64 UUEncoded output. 
        string base64String; 
        base64String = 
          System.Convert.ToBase64String(fileContent, 
                 0, 
                 fileContent.Length); 
        objBinaryData.Text = base64String; 
        b64fileName.Text = FileUpload1.PostedFile.FileName; 
        // create arbitrary MetaData in a string 
        strMetaData.Text = "recAuthorLoc=Patterson, Fred~udf:OPEAnalyst=Tiger Woods~udf:Grant Number=0102030405"; 
    
        StringBuilder strForm = new StringBuilder(); 
        strForm.Append("<form id=\"_xclick\" name=\"_xclick\" target=\"_self\" action=\"http://localhost/HTTPHandleTRIM/UploadHandler.ashx\" method=\"post\">"); 
        strForm.Append("<input type=\"hidden\" name=\"strTrimURL\" value=\"{0}\" />"); 
        strForm.Append("<input type=\"hidden\" name=\"objBinaryData\" value=\"{1}\" />"); 
        strForm.Append("<input type=\"hidden\" name=\"b64fileName\" value=\"{2}\" />"); 
        strForm.Append("<input type=\"hidden\" name=\"strDocument\" value=\"{3}\" />"); 
        strForm.Append("<input type=\"hidden\" name=\"strMetaData\" value=\"{4}\" />"); 
        strForm.Append("</form>"); 
        return String.Format(strForm.ToString() 
         , txtTrimURL.Text 
         , objBinaryData.Text 
         , b64fileName.Text 
         , txtTrimRecordType.Text 
         , strMetaData.Text); 
    } 
    
  • +0

    私が正しく理解していれば、あなたは(ポストバックを作る)ASP.NETファイルアップロードコントロールを使用しています。しかし、あなたはそのコントロールを使用する必要がありますか?私の答えに示されたアプローチがあなたのテストページのために働くのではないでしょうか? – M4N

    +0

    @Martin - それはうまくいくかもしれませんが、FileUploadコントロールを使用することは明らかに物事を行う「新しい」方法であり、オリジナルのASP.NET Webアプリケーションのために既に持っていたテクニックを再加工したくありませんでした。これは、元のWebクライアントを、ColdFusionからPOSTされたときと同じ方法でUploadHandler.ashxを呼び出す追加のボタンで拡張しようとする試みでした。私はそれが理にかなったことを願うしかも、私はFileUploadコントロールなしでアップロードする "昔ながらの方法"を学んだことはありません。 –

    答えて

    0

    はUploadHandler.ashxにフォームを送信するために新しいフォームといくつかのJavascriptを注入することでした。これは(私にとっては)HTTPWebRequest技術よりも把握が容易でした。

    0

    申し訳ありませんが、私は何かが欠けているんだけど、あなたは、単にファイルをアップロードするために単純なHTMLフォームを使用できない場合あなたのハンドラに:

    <form action="UploadHandler.ashx" method="post" enctype="multipart/form-data"> 
        Choose file to upload: 
        <input name="file" type="file" size="50"> 
    </form> 
    
    +0

    @マーチン - ありがとう。

    +0

    元の投稿の私のEDIT-UPDATEをご覧ください。 –

    +0

    私は簡潔なコメントを提供するのが難しいですが、これはあなたの提案された答えよりも複雑だと思います。私が作ったEDIT-UPDATEと、Cleitonと私のコメントからの答えを見てください。それは、この「再POST」の必要性と関係しています。 –

    0

    ジョンゴール、

    あなたが欲しいものを行うための唯一の方法は、HttpWebRequestのを使用しています。

    Hereは、あなたがやりたいクラスの良い例です。私はいつかピカッサに画像とフォームの値を送るようにしました(私はPicassa APIを使うことができましたが、私はそれを楽しんでいました)。

    SendPhoto」関数に注意するだけで、HttpWebRequestで作業を行うためのヒントを得ることができます。私の仕事は何

    +0

    @Cleiton - あなたのご意見ありがとうございます。私はあなたのリンクに従って、私はあなたの例を参照してください。 http://www.netomatix.com/Development/PostRequestForm.aspx –

    +1

    :参照 - 一方で、私は新しいフォームといくつかのJavascriptを注入するのと同様の手法でも動作するかもしれない(別の例を経由して)私も締結したと思いますソースへの-1リンクが壊れています –

    関連する問題