Struts2 上傳圖片文件、ORA-01461 僅能綁定要插入 LONG 列的 LONG 值.docx_第1頁
Struts2 上傳圖片文件、ORA-01461 僅能綁定要插入 LONG 列的 LONG 值.docx_第2頁
Struts2 上傳圖片文件、ORA-01461 僅能綁定要插入 LONG 列的 LONG 值.docx_第3頁
Struts2 上傳圖片文件、ORA-01461 僅能綁定要插入 LONG 列的 LONG 值.docx_第4頁
Struts2 上傳圖片文件、ORA-01461 僅能綁定要插入 LONG 列的 LONG 值.docx_第5頁
全文預覽已結(jié)束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

前天項目中需要用到一個圖片上傳的功能,本來以為就是一個簡單的對文件對象的一個流操作,非常簡單。但著手開始寫的時候才發(fā)現(xiàn),以前了解的文件的上傳和下載是基于Servlet實現(xiàn)對流文件的操作,本次項目中的控制器使用的Struts2,難道讓允許在眾多Action中夾雜上Servlet?即使我能做到這也不符合項目規(guī)約,記得以前在學習Struts2的時候提到過Struts2的幾個核心jar包中就包括文件上傳下載的jar包,但是從來沒有用過。第一直覺就是去查Struts2的官方文檔,但找了半天沒有找到Struts2的AIP,網(wǎng)上大多數(shù)都Struts2的API就是將Struts2的官方文檔轉(zhuǎn)換成了chm格式。知道了Struts2有個文件上傳下載的包,沒用過,本來很簡單的東西瞬間又變成的很復雜的東西。又開始了在網(wǎng)上的尋找。不過功夫還是不負有心人,看了N多資料后。有了點自己小小的總結(jié)。Struts2提供的文件上傳下載確實唄簡單。就以圖片上除為例子:核心代碼就 3 句,其他全是圍繞這3句核心代碼寫的,還有相應的geter和seterJava代碼1. /1、得到圖片將要寫入的路徑2. StringrealPath=ServletActionContext.getServletContext().getRealPath(/images);/實際路徑也就是在tomcat的webapp下的路徑3. 如果使用String path= ServletActionContext.getServletContext().getContextPath();得到的就是你項目下的路徑了。不過還是推薦使用上一個Java代碼1. /2、創(chuàng)建一個在此路徑下的文件2. FilesaveFile=newFile(newFile(realPath),fileTestFileName);/在該實際路徑下實例化一個文件Java代碼1. /3、將上傳文件復制到以上實例化的文件中,這部可能會拋出異常需要捕獲2. FileUtils.copyFile(fileTest,saveFile);Java代碼1. packagecom.ibm.action;2. 3. importjava.io.File;4. importjava.io.IOException;5. 6. mons.io.FileUtils;7. importorg.apache.struts2.ServletActionContext;8. 9. importcom.opensymphony.xwork2.ActionSupport;10. 11. publicclassUploadextendsActionSupport12. privateFilefileTest;/接收這個上傳的文件13. privateStringfileTestFileName;/Struts2提供的格式,在文件名后+FileName就是上傳文件的名字此處千萬別再execute里面使用fileTest.getName();這個方法獲取的名字是Struts2幫你封裝好之后的一個文件名,一個tmp文件的文件名。14. publicFilegetFileTest()15. returnfileTest;16. 17. publicvoidsetFileTest(FilefileTest)18. this.fileTest=fileTest;19. 20. publicStringgetFileTestFileName()21. returnfileTestFileName;22. 23. publicvoidsetFileTestFileName(StringfileTestFileName)24. this.fileTestFileName=fileTestFileName;25. 26. 27. Override28. publicStringexecute()throwsException29. Stringstr=.jpg,.jpeg,.bmp,.gif;30. /限定文件大小是4MB31. if(fileTest=null|fileTest.length()4194304)32. returnimageError;33. 34. for(Strings:str)35. if(fileTestFileName.endsWith(s)36. StringrealPath=ServletActionContext.getServletContext().getRealPath(/images);/實際路徑37. FilesaveFile=newFile(newFile(realPath),fileTestFileName);/在該實際路徑下實例化一個文件38. /判斷父目錄是否存在39. if(!saveFile.getParentFile().exists()40. saveFile.getParentFile().mkdirs();41. 42. try43. /執(zhí)行文件上傳44. /FileUtils類名mons.io.FileUtils;45. /是commons-io包中的,commons-fileupload必須依賴commons-io包實現(xiàn)文件上次,實際上就是將一個文件轉(zhuǎn)換成流文件進行讀寫46. FileUtils.copyFile(fileTest,saveFile);47. 48. catch(IOExceptione)49. returnimageError;50. 51. 52. 53. returnimageSuccess;54. 55. 56. ORA-01461: 僅能綁定要插入 LONG 列的 LONG 值日志錯誤信息:2012-02-21 15:42:11,928 DEBUG org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator - 2012-02-21 15:42:11,928 DEBUG org.springframework.jdbc.support.SQLStateSQLExceptionTranslator - 2012-02-21 15:42:11,945 INFO com.weihua.core.exception.ExceptionMappingInterceptor - org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL ; SQL state 72000; error code 1461;- The error occurred in ibatis/SqlMap/sql-System.xml.- The error occurred while applying a parameter map.- Check the .insert-InlineParameterMap.- Check the statement (update failed).- Cause: java.sql.SQLException: ORA-01461: 僅能綁定要插入 LONG 列的 LONG 值; nested exception is mon.jdbc.exception.NestedSQLException:- The error occurred in ibatis/SqlMap/sql-System.xml.- The error occurred while applying a parameter map.- Check the .insert-InlineParameterMap.- Check the statement (update failed).- Cause: java.sql.SQLException: ORA-01461: 僅能綁定要插入 LONG 列的 LONG 值初步懷疑是插入的值大于該字段數(shù)據(jù)類型約束的長度導致。因為這個異常是指用戶向數(shù)據(jù)庫執(zhí)行插入數(shù)據(jù)操作時,某條數(shù)據(jù)的某個字段值過長,如果是varchar2類型(最大長度為4000字節(jié))的,當長度超過2000-4000(最大值)之間的時候,oracle會自動將該字段值轉(zhuǎn)為long型的,插入操作失敗。解決辦法是:將此字段的類型改為clob或者blob類型;但是將oracle數(shù)據(jù)庫表中的varchar2類型直接改成clob類型會失敗,解決辦法如下:new 一個Sql view,執(zhí)行下列代碼:alter table table_name modify col_name long;alter table table_name modify col_name clob;在進行此操作之前需要先備份表的數(shù)據(jù),然后清空表中的數(shù)據(jù),再修改表的字段屬性,最后將數(shù)據(jù)導入即可。注:clob不需指定長度。1、插入到字符串長度大于4000字節(jié)。2、插入到表中的記錄其中一個是long類型、還有其他實際長度大于2000個字節(jié)(如果是 UTF-8,則是1333個字節(jié));或者是插入的記錄中有兩個或兩個以上長度大于2000字節(jié)的字符串 。用以下SQL可以查出有可能引起ORA-01461錯誤的表:SELECT * FROM(SELECT TABLE_NAME, OWNER, count(*) NUMFROM DBA_TAB_COLUMNSWHERE DATA_TYPE=LONGOR ( DATA_TYPE=VARCHAR2or DATA_TYPE=CHARor DATA_TYPE=NVARCHAR2or DATA_TYPE=NCHAR)AND DATA_LENGTH 1333)AND OWNER NOT IN(SYS,SYSTEM,SH,OLAPSYS,MDSYS,WKSYS,ORDSYS,CTXSYS,ODM,XDB,WMSYS,APEX_030200,EXFSYS,SYSMAN,ORDDATA)GROUP BY TABLE_NAME, OWNER)WHERE NUM 1;關于錯誤的其他原因:當向ORACLE數(shù)據(jù)庫中插入或更新數(shù)據(jù)時,報錯“ORA-01461: 僅可以為插入 LONG 列的 LONG 值賦值”,可能有以下幾種原因:1、插入到字符串長度大于4000字節(jié)。2、插入到表中的記錄的某個字段數(shù)據(jù)的實際長度大于2000個字節(jié)(如果是UTF-8,則是1333個字節(jié));或者是插入的記錄中有兩個或兩個以上長度大于2000字節(jié)的字符串。3、數(shù)據(jù)庫與客戶端的JDBC 驅(qū)動不匹配。對于UTF-8或歐洲的某些字符集,oracle在存儲時,對于一個字符需要2個或3個字節(jié)的存儲空間,雖然

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論