ベンダー製品バックエンドへのファイル転送操作をサポートするWebアプリケーションプロジェクトがあります。これは、IIS 6.0でWin2003のサーバー上のウェブサイトにコンパイル2つのHTTPHandlerのファイルで構成されます:WebフォームのページからHTTPHandler.ashxファイルにデータを投稿するにはどうすればいいですか?
- UploadHandler.ashx
は、これらのファイルは、ColdFusionのWebサイトから "に投稿された" GET DownloadHandler.ashx
しかし、自分のテスト用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);
}
私が正しく理解していれば、あなたは(ポストバックを作る)ASP.NETファイルアップロードコントロールを使用しています。しかし、あなたはそのコントロールを使用する必要がありますか?私の答えに示されたアプローチがあなたのテストページのために働くのではないでしょうか? – M4N
@Martin - それはうまくいくかもしれませんが、FileUploadコントロールを使用することは明らかに物事を行う「新しい」方法であり、オリジナルのASP.NET Webアプリケーションのために既に持っていたテクニックを再加工したくありませんでした。これは、元のWebクライアントを、ColdFusionからPOSTされたときと同じ方法でUploadHandler.ashxを呼び出す追加のボタンで拡張しようとする試みでした。私はそれが理にかなったことを願うしかも、私はFileUploadコントロールなしでアップロードする "昔ながらの方法"を学んだことはありません。 –