5

我将使用 asp.net 文件上传控件上传多个图像。这个解决方案有很多建议。目前正在使用 DataTable 。所有图像都置于 DataTable 视图状态,然后在检查其行时。如果已经存在,我标记一个 Check on 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,我们无法确定该文件是否存在于服务器上。第三个选项可以是如果文件已经存在于上传文件夹中,我们会询问用户是否要覆盖现有文件。或者我应该使用System.IO.File.Exists(pathToCheck))??

我想要你身边的好建议......谢谢:Saquib

4

3 回答 3

2

老兄!我查看了您的代码,并从我的角度来看... 1- 在此 senario 中不要使用 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"];

或将文件读入数据流并且 && 使用((System.IO.File.Exists(Server.MapPath(SavePath + Filename))) ) + ImageBytes 检查 FileName + FilePath

字节[] myData = 新字节[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 检查。

此外,您担心文件夹/路径不会成为问题,因为所有文件都根据您的代码上传到 images 文件夹。

于 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 回答