1

ここ数時間、Googleとstackoverflowを本当によく使用しましたが、問題を解決するのに役立つ解決策やトピックが見つかりませんでした.

タスクと問題:

ローカルマシンで完全に動作する ASP.NET Web フォームを作成しました。これにより、ユーザーは Dynamics CRM 2011 で顧客を作成できます。次に、ユーザーは注釈を顧客に追加し、アップロードするファイルを追加できます。

次のステップは、IIS7 でこの Web フォームを発行することです。これにより、リモートの Windows 2008 R2 サーバー上にあるリモートでアクセスできるようになります。ここで Web フォームをテストし、FileUpload コントロールからデータを選択すると、IIS7 は正しい Path(FileNotFoundException)を取得しません。サーバーから直接ファイルを「アップロード」したい場合でも、データからの Filepath ではなく、常にルート ディレクトリを使用します。 IIS がインストールされている場所。

スタックトレース:

[FileNotFoundException: Die Datei "c:\windows\system32\inetsrv\test.txt" konnte nicht gefunden werden.]
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +12898679
System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath) +2481
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) +229
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) +102
System.IO.File.OpenRead(String path) +55
FirstWebform._Default.create_Button_Click(Object sender, EventArgs e) in C:\Users\flah\Documents\Visual Studio 2010\Projects\FirstWebform\FirstWebform\Main.aspx.cs:86
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +154
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3707

私が試したこと:

  • IIS7 のファイルをFileUpload.Saveas("C:\\folder\\" + FileUpload.Filename)使用する前に一時ディレクトリに保存する必要があることを読みましたが、同じ問題が発生し、ファイルパスが間違っていて、イベントが取得されません。

  • Path.GetFullPath(FileUploadControl.PostedFile.FileName);どちらも機能しなかったパス名を取得しようとしました-同じServer.MapPath();

  • サーバー上でユーザーの権限を設定しました

IIS がルート ディレクトリを常に使用するFileUpload理由と、ローカル マシンで正常に動作する理由がわかりません。

私の試みのない重要なコード:

if (FileUpload1.HasFile)
{
    FileStream stream = File.OpenRead(FileUpload1.PostedFile.FileName);
    byte[] byteData = new byte[stream.Length];
    stream.Read(byteData, 0, byteData.Length);
    stream.Close();

    //Dynamics CRM 2011 upload
    string encodedData = System.Convert.ToBase64String(byteData);                     
    newAnnotation.DocumentBody = encodedData;
    EntityReference refNote = new EntityReference();
    refNote.LogicalName = "account";
    refNote.Id = newAccountId;
    newAnnotation.Attributes.Add("objectid", refNote);
    service.Create(newAnnotation);
} else {
    EntityReference refNote = new EntityReference();
    refNote.LogicalName = "account";
    refNote.Id = newAccountId;
    newAnnotation.Attributes.Add("objectid", refNote);
    service.Create(newAnnotation);
}

誰かがこれで私を助けてくれることを願っています。たぶん、ほんの少しの構成か、アーキテクチャ全体の控えめな表現が間違っているに違いありません。

4

2 に答える 2

0

実際にアップロードされたコンテンツを取得するには、FileUpload.PostedFile.InputStreamを使用する必要があります。例えば、

if (FileUpload1.HasFile)
{
    var stream = FileUpload1.PostedFile.InputStream;
    byte[] byteData = new byte[FileUpload1.PostedFile.ContentLength];
    stream.Read(byteData, 0, byteData.Length);
    stream.Close();

    ...

編集:既存のコードで発生している例外に関して、問題は行にありFile.OpenRead(FileUpload1.PostedFile.FileName);ます-ファイルがクライアントマシンに存在するときにサーバーマシンで名前のファイルを開こうとしています。パス情報について言及していないため、デフォルト(system32など)ディレクトリでファイルを探しています。したがって、クライアントマシンとサーバーマシンが同じで、ファイルがルートディレクトリからアップロードされている場合、コードは機能しますが、すべての実用的な目的のためですそれは役に立たない。

于 2013-01-08T11:22:03.187 に答える
0

ファイルを使用する前に、ファイルを処理する必要があると思います。FileUpload1IIS はファイルを受信し、ユーザー コードが保存を処理するまで一時的な場所に保持します。

以下のコードを既に試したことがあると思いますが、念のため。アクセスする前にファイルを保存する必要があるためです。これは標準的な方法ですが、コード サンプルは保存を試みません。

次のことを試してください。

String savePath = @"c:\temp\uploads\"; // Save folder - Ensure exists, permissions etc

if (FileUpload1.HasFile)
{
    // Append the name of the file to upload to the path.
    savePath += FileUpload1.FileName;

    // TODO : Error checking - verify file is accepted type/size/does not already exist
    FileUpload1.SaveAs(savePath);

    int fileLen = FileUpload1.PostedFile.ContentLength;
    Byte[] Input = new Byte[fileLen];
    System.IO.Stream myStream = FileUpload1.FileContent;
    myStream.Read(Input, 0, fileLen);

    // TODO : Other Processing

} else {
    // TODO : Handle not hasfile
}

ページの下部にあるMSDN ライブラリの FileUploadの例を参照してください。

于 2013-01-08T11:08:10.577 に答える