2013-03-22 67 views
1

我在asp.net中有一個fileupload控件,用於上傳圖片。我想在asp.net的圖像控制中顯示預覽圖像。這裏是背後對象未序列化

protected void Btn_Preview_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       if (FU_Img.HasFile) 
       { 
        string path = Server.MapPath("/TempImages"); 

       FileInfo oFileInfo = new FileInfo(FU_Img.PostedFile.FileName); 
       string fileName = oFileInfo.Name; 

       string fullFileName = path + "//" + fileName; 
       string imagePath = "/TempImages/" + fileName; 

       if (!Directory.Exists(path)) 
       { 
        Directory.CreateDirectory(path); 
       } 
       Session["FileUpload"] = FU_Img; 
       FU_Img.PostedFile.SaveAs(fullFileName); 
       Img_Prof.ImageUrl = imagePath; 
      } 
     } 
     catch (Exception ex) 
     { 
      using (StreamWriter sw = new StreamWriter("/log.txt")) 
      { 
       sw.NewLine = DateTime.Now.ToString() + "--->>" + ex.ToString() + "\n" + ex.StackTrace.ToString(); 
      } 
     } 
    } 

,你可以看到,我把我的圖像控制在會話中的ASPX代碼

C#代碼。它在開發服務器上工作正常。當我張貼的網站域名我得到的問題

Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode. 

堆棧跟蹤

[SerializationException: Type 'System.Web.UI.WebControls.FileUpload' in Assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.] 
    System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +7738443 
    System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) +258 
    System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +111 
    System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter) +422 
    System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter) +51 
    System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +410 
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +134 
    System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1577 

[HttpException (0x80004005): Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.] 
    System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1662 
    System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(Object value, BinaryWriter writer) +34 
    System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter writer) +606 
    System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData item, Stream stream) +239 
    System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData item, Int32 initialStreamSize, Byte[]& buf, Int32& length) +72 
    System.Web.SessionState.OutOfProcSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) +87 
    System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) +560 
    System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75` 

這裏是我的web.config

<sessionState mode="InProc" 
        cookieless="true" 
        timeout="20"/> 

中預覽我的網頁後,我點擊更新bnutton,它什麼也沒做。甚至沒有重定向到其他頁面。 這裏是我的提交按鈕代碼

if (Session["FileUpload"] != null && (!FU_Img.HasFile)) 
      { 
       FU_Img = (FileUpload)Session["FileUpload"]; 
      } 
UserOthers UO = new UserOthers(); 
      if (FU_Img.HasFile) 
      { 
       try 
       { 
        string Photofilename = Path.GetFileName(FU_Img.FileName); 
        Photofilename = Photofilename.Split('.')[1].ToString(); 
        String PathFolder = Server.MapPath(Request.ApplicationPath + @"\upload\u" + Session["UserID"].ToString()); 
        if (!Directory.Exists(PathFolder)) 
        { 
         Directory.CreateDirectory(PathFolder); 
        } 
        FU_Img.PostedFile.SaveAs(Server.MapPath(Request.ApplicationPath + @"\upload\u" + Session["UserID"].ToString() + "\\image." + Photofilename)); 
        UO.Image = @"/upload/u" + Session["UserID"].ToString() + "/image." + Photofilename; 
       } 
       catch (Exception ex) 
       { 
        //StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message; 
       } 
      } 
con.update_Pic_Vid(UO, Session["UserID"].ToString()); 
      Response.Redirect("/AccountSettings.aspx"); 

請告訴我,我做錯了什麼。

+1

你爲什麼要在'Session'中保存'FileUpload'控件?是否有任何理由不能在Session中保存'byte []'? – 2013-03-22 12:20:30

+0

實際上,我正在預覽圖像。如果單擊預覽按鈕,則fileupload按鈕不會保留數據。所以爲了保持它的狀態,我保持這個狀態,所以如果用戶對當前的預覽很滿意,我可以提交這個文件。 – 2013-03-22 12:22:45

+1

我明白,但您不需要保留整個控件,只需按住發佈在第一個帖子上的'byte []'。 – 2013-03-22 12:40:48

回答

1

在會話中存儲控件不是正確的方法。正如您的堆棧跟蹤指出「FileUpload」未標記爲可序列化。

您將圖像存儲在磁盤上,並將該圖像的路徑存儲在會話中並進一步重用。

4

給看看這個post

您可以將數據流從文件上傳轉換中使用上面的鏈接張貼的readFully功能是這樣的:

var byteArray = ReadFully(FU_Img.PostedFile.InputStream) ; 
Session["FileUpload"] = byteArray; 

,然後在上傳函數u可以將代碼更改爲:

byte[] fileUpload = null; 

if (Session["FileUpload"] != null ) 
{ 
    fileUpload = Session["FileUpload"] as byte[]; 
} 

然後將字節流保存到磁盤或數據庫。