5

asp.net ファイル アップロード コントロールを使用して複数の画像をアップロードします。このソリューションには多くの提案があります..現在 DataTable を使用しています。すべての画像がDataTableビューステートに置かれ、その行をチェックしている..すでに存在する場合はFileNameにチェックマークを付けてアップロードしません..しかし、ユーザーが同じ名前の画像を別のフォルダー/パスから参照/アップロードすると、が問題になります。私のコードはここにあります

 private void AttachImage()
        {
                string fileName = Convert.ToString(Guid.NewGuid());
                string filePath = "images/" + fileName;
                fileName = Path.GetFileName(ImageUpload.PostedFile.FileName);
                ImageUpload.SaveAs(Server.MapPath(filePath));
                DataTable dt = new DataTable();

                DataColumn dc = new DataColumn();
                dc = new DataColumn("Name", typeof(String));
                dt.Columns.Add(dc);

                dc = new DataColumn("Path", typeof(String));
                dt.Columns.Add(dc);

                dt.Rows.Add(fileName, filePath);
                if (ViewState["dt"] == null)
                {
                    ViewState["dt"] = dt;
                }
                else// (ViewState["dt"] != null)
                {
                    DataTable tmpTable = (DataTable)ViewState["dt"];
                    tmpTable.Rows.Add(fileName, filePath);
                    ViewState["dt"] = tmpTable;
                }


            lstProductsImage.DataSource = (DataTable)ViewState["dt"];
            lstProductsImage.DataBind();

        }

次に、 GUID を使用してイメージを割り当てます。ただし、FileName のみが変更され、このファイルがサーバー上に存在するかどうかを判断できないため、適切ではありません。3 番目のオプションは、ファイルがアップロード フォルダーに既に存在する場合、既存のファイルを上書きするかどうかをユーザーに確認することです。または、使用する必要がありますSystem.IO.File.Exists(pathToCheck))か??

あなたの側からの良い提案が欲しい... ありがとう: Saquib

4

3 に答える 3

2

お前!私はあなたのコードをレビューし、私の観点から...1-このシナリオではGUIDを使用しないでください。2-次のコードを使用してファイル名を取得します(要件に応じて変更します)

string fileName = System.IO.Path.GetFileName(dsPhotosFiles.Tables[0].Rows[i]["filePath"].ToString());

3-配列を使用して画像バイトを取得します(たとえば、byte [] imageBytes;)

byte[] imageBytes;
  imageBytes = (byte[])dsPhotosFiles.Tables[0].Rows[i]["fileBytes"];

またはファイルをデータストリームに読み込み、&& FileName + FilePathをチェックします((System.IO.File.Exists(Server.MapPath(SavePath + Filename))))+ ImageBytes

byte [] myData = new Byte [nFileLen];

4-その後、ファイルを開いて、ファイルが本当にJPEGであるかどうかを確認します(次のコードからヘルプを得ることができます。

System.Drawing.Image.GetThumbnailImageAbort myCallBack = 
                       new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
        Bitmap myBitmap;

       try
        {
            myBitmap = new Bitmap(Server.MapPath(sSavePath + sFilename));

            // If jpg file is a jpeg, create a thumbnail filename that is unique.
            file_append = 0;
            string sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                                                     + sThumbExtension + ".jpg";
            while (System.IO.File.Exists(Server.MapPath(sSavePath + sThumbFile)))
            {
                file_append++;
                sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) + 
                               file_append.ToString() + sThumbExtension + ".jpg";
            }

            // Save thumbnail and output it onto the webpage
            System.Drawing.Image myThumbnail
                    = myBitmap.GetThumbnailImage(intThumbWidth, 
                                                 intThumbHeight, myCallBack, IntPtr.Zero);
            myThumbnail.Save (Server.MapPath(sSavePath + sThumbFile));
            imgPicture.ImageUrl = sSavePath + sThumbFile;

            // Displaying success information
            lblOutput.Text = "File uploaded successfully!";

            // Destroy objects
            myThumbnail.Dispose();
            myBitmap.Dispose();
        }
        catch (ArgumentException errArgument)
        {
            // The file wasn't a valid jpg file
            lblOutput.Text = "The file wasn't a valid jpg file.";
            System.IO.File.Delete(Server.MapPath(sSavePath + sFilename));
        }

これがあなたのお役に立てば幸いです...よろしく:Azeem Raavi

于 2012-10-12T10:15:02.433 に答える
1

重複を許可していない場合 (およびチェックが行われている場合)、なぜファイルの名前を変更するのでしょうか? それらを元の名前で保存し、その後のアップロードが実行されるときに File.Exists チェックを使用するだけです。

また、すべてのファイルがコードに基づいて画像フォルダーにアップロードされるため、フォルダー/パスについて心配する必要はありません。

于 2012-10-12T05:46:38.657 に答える
0

Javaスクリプトで試してみてください。それがあなたの助けになるかもしれません

私のaspxでJavaコードで飛ぶ

$("#UPLOAD_BUTTON").uploadify({
                  'buttonClass'   : "ui-icon ui-icon-plus",
                  'swf'            : '/web/uploader/uploadify.swf',                  
                  'uploader'       : '/web/uploader/Uploadify.ashx?ASPSESSID=<% =Session.SessionID %>',
                  'cancelImage'    : '/web/uploader/uploadify-cancel.png',
                  'folder'         : '/uploads',
                  'multi'          : true,
                  'auto'           : true,
                  'checkExisting'  : '/web/uploader/Uploadify.ashx?check=true',
                  'queueID'        : "UploadFilesQueue",
                  'buttonText'     : ' ',          
                  'hideButton'     : true,  
                  'fileTypeExts'   : '*.*',
                  'fileTypeDesc'   : 'Alle Dateien',
                  'onQueueComplete': function(event,data) {                      
                  },
                  postData : {
                    "stepID" : $("#lblStepID").text(),
                    "ASPSESSID" : "<% =Session.SessionID %>",                    
                  }
              });

SessionID をパラメーターとして渡し、それを Global.asax ファイルで取得する必要があります。そうしないと、アップロードごとに新しい ASP.NET セッションを作成します。

jquery.uploadify.js ファイルで、この関数を見つけて変更する必要があります

function onUploadStart(file) 

ここで、Upload-ASHX ファイルからの Returncode に反応できます。

次のようなさまざまな条件に対して、さまざまなリターン コードを使用します。

ReturnCode=1 -> File allready Exists
ReturnCode=2 -> File is to Big

....

于 2012-10-12T05:44:24.327 に答える