2010-09-23 69 views
1

我正在使用CGI.pm版本3.10來使用Perl進行文件上傳。我有一個上傳文件的Perl腳本,我的一個應用程序通過簽入簽出設備跟蹤上傳文件的不同修訂版本。爲什麼CGI.pm上傳成功的新文件上傳文件的舊版本?

重新造物步驟:

  • 我已經用我的應用程序(這是基於網絡的使用Apache)做了結賬(下載文件)。
  • 從當前用戶會話中註銷。
  • 用相同的憑證重新登錄,然後簽入(上傳)一個新文件。

輸出:

  • 上傳成功
  • 的Perl上傳腳本顯示了正確的上傳數據
  • 文件的新修訂創建

輸出是正確的和預期之外的一個案件是問題

期:

  • 新上傳的文件的內容與上次上載的數據庫中的內容相同。

我正在使用臨時文件夾來複制新內容,如果我在上傳腳本中打印新內容,那麼它就是正確的。我對CGI上傳大小沒有限制。它似乎在CGI環境中失敗了,可能是我正在使用的版本。我不使用污點模式。

任何人都可以幫助我理解可能的原因嗎?

+1

您應該嘗試跟蹤某些日誌中文件的內容。你會看到在哪一步它改變了它不應該的方式。使用您提供的信息很難理解發生的情況。這是太高的水平。請嘗試*本地化*錯誤並附上導致它的代碼。 – 2010-09-23 13:45:14

+1

你必須顯示一些代碼。構建一個展示問題的最小測試用例,以便其他人可以自行復制它。 – daxim 2010-09-23 13:47:15

+1

很難理解你的問題。您從數據庫中獲取文件的最新版本,下載它,在本地修改並重新上傳。它可以很好地上傳到臨時文件夾。當您嘗試加載(或比較?)它與數據庫時,您意識到臨時文件現在具有文件在數據庫中的內容。這是正確的嗎 ?如果是這樣,我的猜測是你的代碼來檢查數據庫採取該數據庫中的文件,並用它替換臨時的。但是隨着你的高級描述,很難說明原因。正如Ivan所建議的那樣,您應該在流程的各個步驟檢查文件以進行調試。 – 2010-09-23 16:26:05

回答

0

我發現了這個問題。原因是複製文件的目標路徑不正確,這是因爲我的應用程序的一個事件將複製文件的路徑映射到不同的目錄,並且此路徑存儲在用戶會話中。只有當我在凝視上傳腳本之前運行事件時纔會發生這種情況。這是很難趕上的原因。由於上傳腳本旨在從相同路徑中選擇新複製的文件,所以最終總會以另一個版本上傳DB中的同一文件。新複製的文件位於新路徑中。

通過在上載前映射正確的路徑來解決。

謝謝

1

聽起來就像你得到的舊文件名卡在文件上傳字段。不知道這是否會發生在文件字段中,但這是其他字段類型的功能。

嘗試添加-nosticky編譯指示,例如,use CGI qw(-nosticky :all);。要嘗試的另一個附註是-private_tempfiles,它應該防止用戶甚至在自己的上傳中「竊聽」。

當然,這可能是因爲您需要本地化(我的)某些變量或向文件字段添加-force。