Comment afficher des données à partir d'un formulaire en ligne page à un HTTPHandler.ashx fichier?
J'ai un projet d'application web pour soutenir les opérations de transfert de fichier pour le fournisseur de produits backend. Il est composé de 2 HTTPHandler les fichiers compilés dans un site web sur un Win2003 server avec IIS 6.0:
- UploadHandler.ashx
- DownloadHandler.ashx
Ces fichiers "Affichés" à partir d'un site web ColdFusion qui expose l'interface utilisateur. Dans un sens, mon travail est fait parce que ces gestionnaires travailler et à être appelé à partir de ColdFusion.
Encore, je suis très frustré avec mon incapacité à obtenir mon propre "test de l'INTERFACE utilisateur" (par défaut.aspx) à utiliser lors de mes tests, raffinement indépendant de ColdFusion.
<asp:Button ID="DownloadButton" PostBackUrl="~/DownloadHandler.ashx" runat="server" Text="Download"/>
À l'aide d'un PostBackUrl pour le Téléchargement fonctionne très bien, - lorsque le DownloadHandler.ashx est entré, il trouve la clé de sa valeur d'entrée dans contexte.Demande.Form["txtRecordNumber"];
Mais je ne peux pas utiliser cette technique pour le Téléchargement car je dois faire un traitement (en quelque sorte de lire les octets de la fileupload1.postedfile dans une variable de FORMULAIRE, donc mon UploadHandler.ashx fichier peut obtenir son entrée provenant de la Demande.Formulaire à Télécharger).
Ma première approche a essayé d'utiliser HTTPWebRequest qui semblait trop complexe et je n'ai jamais pu obtenir de travailler. Les symptômes ont commencé avec un code d'état HTTP 401, puis s'est transformé en un code d'état 302 j'ai donc recherché d'autres idées.
Voici mon dernier fragment de code dans mon défaut.aspx:
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";
}
Tentatives pour utiliser le Serveur.De transfert (ci-dessus) pour mon .ashx fichier provoque une erreur:
erreur lors de l'exécution enfant demande pour UploadHandler.ashx
Les tentatives d'utiliser la Réponse.Redirect (ci-dessus) pour mon .ashx fichier de résultat à OBTENIR (pas de POST) et de la Trace.axd bien sûr affiche rien dans le Formulaire de collecte de sorte que semble mal aussi.
J'ai même essayé de cloner-ing mon .ashx fichier et créé UploadPage.aspx (un formulaire en ligne avec aucun des éléments HTML) et a ensuite essayé:
Server.Transfer("UploadPage.aspx", true);
//Response.Redirect("~/UploadPage.aspx");
Ni de ceux qui me permettent de voir les données du formulaire j'ai besoin de voir dans la Requête.Formulaire à l'intérieur de mon code qui traite la demande de Téléchargement. Je suis clairement en manque de quelque chose ici...merci d'avance pour votre aide.
ÉDITION-MISE À JOUR:
Je pense que je peux clarifier mon problème. Lorsque le UploadHandler.ashx est affiché à partir de ColdFusion, tous les commentaires dont elle a besoin est disponible dans la collection de FORMULAIRE (par exemple la Requête.Form["fileData"], etc.)
Mais quand je l'utilise de contrôle, il génère une publication sur mon lancement de la page web (c'est à dire par défaut.aspx). Cela me permet de consulter le contenu par le biais de FileUpload1.PostedFile comme dans:
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;
}
Pourtant je suis pas à l'aide de la FileUpload1.PostedFile.Méthode SaveAs pour sauver le fichier quelque part sur mon serveur web. J'ai besoin de quelque sorte - pardonnez le langage ici - "re-post" ces données à un fichier différent - à savoir, mon UploadHandler.ashx gestionnaire. Tous les goofy techniques que j'ai essayé ci-dessus ne parviennent pas à accomplir ce dont j'ai besoin.
ÉDITION-mise à JOUR (20 Août 2009) - ma SOLUTION finale à l'aide de 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);
}
Il pourrait fonctionner, mais en utilisant le contrôle FileUpload est apparemment le "plus récent" façon de faire les choses et je n'ai pas envie de retravailler les techniques que j'avais déjà en place pour mon premier ASP.NET web app. C'était une tentative d'étendre le site web d'origine du client avec un BOUTON supplémentaire qui serait l'effet de l'appel à la UploadHandler.ashx de la même manière que quand il est Affiché à partir de ColdFusion. J'espère qu'un sens. D'ailleurs, je n'ai jamais appris la "vieille manière" de le télécharger sans le contrôle FileUpload.
OriginalL'auteur John Adams | 2009-08-18
Vous devez vous connecter pour publier un commentaire.
Désolé si je suis absent quelque chose, mais ne pouvez-vous pas tout simplement utiliser un simple formulaire HTML à télécharger des fichiers à votre gestionnaire de:
Veuillez voir mon ÉDITION-mise à JOUR dans le post original.
Je vais avoir de la difficulté à fournir un bref commentaire, mais je pense que c'est plus compliqué que votre proposition de réponse. Voir l'ÉDITION-mise à JOUR j'ai fait et la réponse de Cleiton et mes commentaires. Il a à voir avec ce besoin de "re-POST".
OriginalL'auteur M4N
Ce qui a fonctionné pour moi a été d'injecter une nouvelle FORME et un peu de Javascript pour envoyer le FORMULAIRE à l'UploadHandler.ashx. Ce (pour moi) est plus facile à saisir que la HTTPWebRequest technique.
OriginalL'auteur John Adams
John Galt,
La seule façon de faire ce que vous voulez, c'est à l'aide de HttpWebRequest.
Ici est un bon exemple d'une Classe qui faire ce que vous voulez. Je l'ai fait pour envoyer l'image et les valeurs d'un formulaire de picassa servir il y a quelques temps (je sais que je pourrais utiliser Picassa API, mais je l'ai fait pour le fun).
Vous avez seulement besoin de prêter attention à la " SendPhoto' fonction pour obtenir des conseils sur ce que vous avez à faire pour faire HttpWebRequest pour faire le travail.
-1 lien vers la source est cassé
OriginalL'auteur Cleiton