2

ravenDb に添付ファイルを保存しようとしています。ファイルが見つからないというエラーが発生します。

MVC ビュー:

 <input type="file" name="file" id="Ids2" style="float:right"/>

ajax 呼び出しを介して、上記のコントロールで選択されたファイル名の値をコントローラー メソッドに渡します。コントローラー メソッドは、ファイル名を「アップロード」というカスタム メソッドに送信します。

public virtual string Upload(string fileName)
   {
      IDocumentSession session = GetCurrentDocumentSession();
      var id = "upload/" + randomGen();

      session.Advanced.DatabaseCommands.PutAttachment(id,null, 
                           File.ReadAllBytes(fileName), optionalMetaData);    
      return id;
   }

C:\ProgramFiles (x86).... ファイルが指定されていません。ビューで言ってみましょう - 私は C:/Doc1.txt をブラウズし、[追加] ボタンをクリックしてビューに他のフィールドを保存し、ファイル アップロード コントロールからファイル名/パスを取得します。

session.advance.databasecommands... 行でエラーが発生します

ファイル 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\Doc1.txt' が見つかりませんでした。

Doc1.txt ファイルを手動で上記の場所に移動すると、ravenDB によって添付ファイルが保存され、localhost:8080/static/upload/keyvalue から参照できます。

c:programfiles のデフォルトの場所のように見える場所からではなく、ユーザーが選択した場所から ravenDB にファイルを取得させるにはどうすればよいですか .....

編集:

 function () {

var iFile = iContainer.find( '#Ids2' ).val();  

var DataToSave = {

    'Attachment' : iFile 
};

var encodedData = $.toJSON(DataToSave);


$.ajax({
    type: 'POST' ,
    url: '/AttController/Attach' ,
    data: encodedData,
    contentType: 'application/json; charset=utf-8' ,
    success: function (rc) {
        if (rc.Success) {
           // more javascript reroutes..business logic
        }
        else {

            alert(rc.Message);
        }
    },
    error: function (xhr, ajaxOptions, thrownError) {

        alert( 'Error attaching \n' + xhr.response);
    }
 });

 };
4

1 に答える 1

1

ブラウザーによって異なります。html ファイル コントロールは、ファイルへのフル パスを格納しません。Chrome を使用してスクリプトをデバッグする場合

var iFile = iContainer.find( '#Ids2' ).val(); 

C:\fakepath\yourfile.txt のようなものが返されます。IE と同様にフル パスが返されます。

また、Ajaxでは、ファイルのバイトをプッシュするのではなく、ファイル名のみをプッシュします。つまり、このWebサイトをWebサーバーのブラウザーでのみ実行する場合を除き、ファイルがWebサーバーと同じ場所にある可能性がありますスリム。

ajax 経由で MVC コントローラーにファイルをアップロードしようとしている場合は、uploadify をお勧めします。

            $("#Ids2").uploadify(
            {
                uploader: '/AttController/Attach',
                swf: 'your/path/to/uploadify.swf',
                cancelImg: 'your/path/to/cancel.jpg',
                buttonText: 'Select File',
                fileSizeLimit: '300KB',
                fileTypeDesc: 'Image Files',
                fileTypeExts: '*.gif; *.jpg; *.png',
                auto: 'true',
                multiple: 'false',
                onError: function(type, info) {

                },
                onUploadSuccess: function(file, data, response) {

                }
            });

次に、コントローラーのアクションを次のように変更します

public virtual ActionResult Upload(HttpPostedFileBase FileData)

FileData には FileName のようなものがあり、入力ストリームにもファイルがあります。

于 2012-07-19T20:54:16.843 に答える