0

多くの人が、 flajaxianの複数ファイル アップロード コントロール を使用してその場でフォルダーの場所を変更する過剰な方法を考え出しています。

より経験豊富な人が私が思いついた方法を見て、私が心配すべき大きな問題があるかどうかを知らせてくれるかどうか疑問に思っていました. (適切なエラーチェックが行われていると仮定します。)

以下に示すように、コントロールを初期化することを計画しました。:

<cc1:FileUploader ID="FileUploader1" runat="server" OnFileReceived="fileUploader_FileReceived" RequestAsPostBack="true">

    </cc1:FileUploader>

(RequestAsPostBack="true"イベントハンドラーでチェックする必要がある他のコントロールがいくつかあるので)

HttpFileCollection.SaveAsのプロパティを変更するだけfileUploader_FileReceived eventです。flajaxian は一度に 1 つのファイルをアップロードするため、コレクションには 1 つのファイルしかないと予想できます (そうでなければ、ループを使用できます)。

protected void fileUploader_FileReceived(object sender, 
com.flajaxian.FileReceivedEventArgs e)
 {

        HttpFileCollection files = Request.Files;
        // Change path to whichever folder I need
        String TempFileName = "C:\\NEW\\PATH\\TO\\Folder\\" + files[0].FileName;
        // Save the file.
        files[0].SaveAs(TempFileName);
}

この実装は、フォルダーが存在する限りうまく機能するようです! technicallyすべてのエラーチェックが行われていると仮定して、このような実装に何か問題があるかどうか疑問に思っていました。

ありがとう!

4

2 に答える 2

0

OnFileNameDeterminingこれを行うためのより良い方法は、アダプターを使用し、イベントでフォルダーの場所を上書きすること です。このようにして、アダプターですべての機能も取得します。

<cc1:FileUploader ID="FileUploader1" runat="server"` OnFileReceived="fileUploader_FileReceived" RequestAsPostBack="true">
            <Adapters>
                <cc1:FileSaverAdapter runat="server" FolderName="Ups" OnFileNameDetermining="fileUploader_FileDetermined" />
            </Adapters>
</cc1:FileUploader>

ファイル決定イベントでは、フォルダーの場所をプログラムで変更できます

protected void fileUploader_FileDetermined(object sender, com.flajaxian.FileNameDeterminingEventArgs e)
{
    e.FileName = "C:\\NewFolder\\" + e.File.FileName;
}

FileReceived イベントを使用して、フォルダーが存在するかどうかを確認し、存在しない場合は作成します。

protected void fileUploader_FileReceived(object sender, com.flajaxian.FileReceivedEventArgs e)
{
     int fileIndex = e.Index;
     if (fileIndex == 0)
     {
        // We are on our first file, check if the new folder exists, if not, create it
     }
}
于 2012-05-02T16:22:53.643 に答える
0

Web サイト内にファイルを保存する場合は、MapPath メソッドを使用して、Web サイト内の仮想パスから物理フォルダーを作成することを検討してください。

MapPath("/Images/User1")

これは私の最小限の APSX 実装です

<fjx:FileUploader ID="FileUploader1" runat="server" OnFileReceived="FileUploader2_FileReceived">
</fjx:FileUploader>

アダプターまたはフォルダーが指定されていません。FileRecevied イベントが発生すると、フォーム認証のユーザー名に基づいてファイルをフォルダーに保存します (フォルダー名に使用できない文字は名前に使用しません)。

また、FileReceivedEventArgs には (HTTP) ファイルへの参照があることに注意してください。

e.File

FileUploader コントロールは、処理されたすべてのファイルを表示します。エラーが発生した場合は、クライアントに返されるステータス コード (550 など) を設定することもできます。

FileReceived イベントへのサーバー呼び出しは、指定した場合でも、通常のページ ポストバック内では発生しないことに注意してください。

RequestAsPostBack="true"

そのため、PagePreRender は発生しません。

唯一の問題は、アップロードが完了した後、クライアントで他の処理をどのように実行するかです (アップロードされた画像の表示など)。

この目的のために進行中の作業は、クライアント側のイベントを使用することです

FileStateChanged

最後のファイルが処理されたとき

if (file.state > Flajaxian.File_Uploading && isLast) {

JQuery を使用して、非表示の送信ボタンをクリックします。ポストバックは、ファイルが保存されたときに保存されたセッション値を調べ、画像を DIV にレンダリングします。

ただし、即時送信すると、何らかの理由で FileReceived イベント内の空のセッションで問題が発生します (内部の非同期コールバックが完了していないためだと思います)。ポストバックを開始する前に数秒間停止すると、問題なく動作します。

于 2012-06-28T20:15:34.230 に答える