<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Latest posts for the topic "JSP精選實用範例(二):檔案上傳"]]></title>
		<link>http://www.andowson.com/posts/list/5.page</link>
		<description><![CDATA[Latest messages posted in the topic "JSP精選實用範例(二):檔案上傳"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 預先安裝函式庫：[url=http://commons.apache.org/downloads/download_fileupload.cgi]Apache Commons FileUpload[/url], [url=http://commons.apache.org/downloads/download_io.cgi]Apache Commons IO[/url]<br /> 程式碼：<br /> fileupload.html:<br /> [code=html]&lt;html&gt;<br /> &lt;head&gt;<br /> &lt;title&gt;File Upload&lt;/title&gt;<br /> &lt;meta http-equiv="Content-Type" content="text/html; charset=big5" /&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br /> <p><font size="5"color="#FF0000"><b>檔案上傳</b></font></p><br /> <br /> &lt;form name="upload" enctype="multipart/form-data" method="post" action="fileupload.jsp"&gt; <br /> <p>上傳檔案： &lt;input type="file" name="file" size="20" maxlength="20" /&gt; </p><br /> <p>檔案說明： &lt;input type="text" name="filedesc" size="30" maxlength="50" /&gt; </p><br /> <p> &lt;input type="submit"value="上傳" /&gt; &lt;input type="reset" value="清除" /&gt; </p><br /> &lt;/form&gt;<br /> <br /> &lt;/body&gt;<br /> &lt;/html&gt;[/code]<br /> fileupload.jsp:<br /> [code]<br /> &lt;%@ page contentType="text/html; charset=UTF-8"%&gt;<br /> &lt;%@ page import="java.io.File"%&gt;<br /> &lt;%@ page import="java.util.Iterator"%&gt;<br /> &lt;%@ page import="java.util.List"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.*"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%&gt;<br /> &lt;%@ page import="org.apache.commons.io.FilenameUtils"%&gt;<br /> &lt;%<br />     String saveDirectory = application.getRealPath("/upload");<br />     <br />     // Check that we have a file upload request<br />     boolean isMultipart = ServletFileUpload.isMultipartContent(request);<br />     out.println("isMultipart="+isMultipart+"&lt;br&gt;");<br />     <br />     // Create a factory for disk-based file items<br />     FileItemFactory factory = new DiskFileItemFactory();<br />  <br />     // Create a new file upload handler<br />     ServletFileUpload upload = new ServletFileUpload(factory);<br /> <br />     //Create a progress listener<br />     ProgressListener progressListener = new ProgressListener(){<br />        private long megaBytes = -1;<br />        public void update(long pBytesRead, long pContentLength, int pItems) {<br />            long mBytes = pBytesRead / 1000000;<br />            if (megaBytes == mBytes) {<br />                return;<br />            }<br />            megaBytes = mBytes;<br />            System.out.println("We are currently reading item " + pItems);<br />            if (pContentLength == -1) {<br />                System.out.println("So far, " + pBytesRead + " bytes have been read.");<br />            } else {<br />                System.out.println("So far, " + pBytesRead + " of " + pContentLength<br />                                   + " bytes have been read.");<br />            }<br />        }<br />     };<br />     upload.setProgressListener(progressListener);<br />     <br />     // Parse the request<br />     List /* FileItem */ items = upload.parseRequest(request);<br />     <br />     // Process the uploaded items<br />     Iterator iter = items.iterator(); <br />     while (iter.hasNext()) {<br />         FileItem item = (FileItem) iter.next();<br /> <br />         if (item.isFormField()) {<br />             // Process a regular form field<br />             //processFormField(item);<br />             String name = item.getFieldName();<br />             String value = item.getString();<br />             value = new String(value.getBytes("UTF-8"), "ISO-8859-1");<br />             out.println(name + "=" + value+"&lt;br&gt;");<br />         } else {<br />             // Process a file upload<br />             //processUploadedFile(item);<br />             String fieldName = item.getFieldName();<br />             String fileName = item.getName();<br />             String contentType = item.getContentType();<br />             boolean isInMemory = item.isInMemory();<br />             long sizeInBytes = item.getSize();<br />             out.println("fieldName="+fieldName+"&lt;br&gt;");<br />             out.println("fileName="+fileName+"&lt;br&gt;");<br />             out.println("contentType="+contentType+"&lt;br&gt;");<br />             out.println("isInMemory="+isInMemory+"&lt;br&gt;");<br />             out.println("sizeInBytes="+sizeInBytes+"&lt;br&gt;");<br />             if (fileName != null && !"".equals(fileName)) {<br />                 fileName= FilenameUtils.getName(fileName);<br />                 out.println("fileName saved="+fileName+"&lt;br&gt;");<br />                 File uploadedFile = new File(saveDirectory, fileName);<br />                 item.write(uploadedFile);<br />             }            <br />         }<br />     }                <br /> %&gt;<br /> [/code]<br /> 注意：<br /> 請自行在您網頁應用程式的根目錄下建立一個upload的子目錄，並確認或設定讓Tomcat對upload目錄具有可寫入權限(Linux環境)。<br /> 參考資料：<br /> http://commons.apache.org/fileupload/using.html]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/300.page</guid>
				<link>http://www.andowson.com/posts/preList/197/300.page</link>
				<pubDate><![CDATA[Sat, 15 Dec 2007 12:27:25]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 使用Streaming API的方式：<br /> 程式碼：<br /> fileupload_streaming.html:<br /> [code=html]<br /> &lt;html&gt;<br /> &lt;head&gt;<br /> &lt;title&gt;File Upload&lt;/title&gt;<br /> &lt;meta http-equiv="Content-Type" content="text/html; charset=big5"&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br /> <p><font size="5"color="#FF0000"><b>檔案上傳</b></font></p><br /> <br /> &lt;form name="upload" enctype="multipart/form-data" method="post" action="fileupload_streaming.jsp"&gt; <br /> <p>上傳檔案： &lt;input type="file" name="file" size="20" maxlength="20"&gt; </p><br /> <p>檔案說明： &lt;input type="text" name="filedesc" size="30" maxlength="50"&gt; </p><br /> <p> &lt;input type="submit"value="上傳"&gt; &lt;input type="reset" value="清除"&gt; </p><br /> &lt;/form&gt;<br /> <br /> &lt;/body&gt;<br /> &lt;/html&gt;[/code]<br /> fileupload_streaming.jsp:<br /> [code]&lt;%@ page contentType="text/html; charset=UTF-8"%&gt;<br /> &lt;%@ page import="java.io.*"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.*"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.util.Streams"%&gt;<br /> &lt;%@ page import="org.apache.commons.io.FilenameUtils"%&gt;<br /> &lt;%<br />     String saveDirectory = application.getRealPath("/upload");<br />     <br />     // Check that we have a file upload request<br />     boolean isMultipart = ServletFileUpload.isMultipartContent(request);<br />     out.println("isMultipart="+isMultipart+"&lt;br&gt;");<br />     <br />     // Create a new file upload handler<br />     ServletFileUpload upload = new ServletFileUpload();<br /> <br />     //Create a progress listener<br />     ProgressListener progressListener = new ProgressListener(){<br />        private long megaBytes = -1;<br />        public void update(long pBytesRead, long pContentLength, int pItems) {<br />            long mBytes = pBytesRead / 1000000;<br />            if (megaBytes == mBytes) {<br />                return;<br />            }<br />            megaBytes = mBytes;<br />            System.out.println("We are currently reading item " + pItems);<br />            if (pContentLength == -1) {<br />                System.out.println("So far, " + pBytesRead + " bytes have been read.");<br />            } else {<br />                System.out.println("So far, " + pBytesRead + " of " + pContentLength<br />                                   + " bytes have been read.");<br />            }<br />        }<br />     };<br />     upload.setProgressListener(progressListener);<br /> <br />     // Parse the request<br />     FileItemIterator iter = upload.getItemIterator(request);<br />     while (iter.hasNext()) {<br />         FileItemStream item = iter.next();<br />         String name = item.getFieldName();<br />         InputStream stream = item.openStream();<br />         if (item.isFormField()) {<br />             String value = Streams.asString(stream);<br />             out.println(name + "=" + value+"&lt;br&gt;");<br />         } else {<br />             System.out.println("File field " + name + " with file name "<br />                 + item.getName() + " detected.");<br />             // Process the input stream<br />             String fieldName = item.getFieldName();<br />             String fileName = item.getName();<br />             String contentType = item.getContentType();<br />             out.println("fieldName="+fieldName+"&lt;br&gt;");<br />             out.println("fileName="+fileName+"&lt;br&gt;");<br />             out.println("contentType="+contentType+"&lt;br&gt;");<br />             if (fileName != null && !"".equals(fileName)) {<br />                 fileName= FilenameUtils.getName(fileName);<br />                 out.println("fileName saved="+fileName+"&lt;br&gt;");<br />                 File uploadedFile = new File(saveDirectory, fileName);<br />                 FileOutputStream uploadedFileStream = <br />                     new FileOutputStream(uploadedFile);<br />                 Streams.copy(stream, uploadedFileStream, true);<br />             }<br />         }<br />     }              <br /> %&gt;<br /> [/code]<br /> 參考資料：<br /> http://commons.apache.org/fileupload/streaming.html]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/301.page</guid>
				<link>http://www.andowson.com/posts/preList/197/301.page</link>
				<pubDate><![CDATA[Sat, 15 Dec 2007 12:50:49]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 增加檔案大小限制及檔案類型的篩選：<br /> 程式碼：<br /> fileupload_control.html:<br /> [code=xhtml]<br /> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;<br /> &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br /> &lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br /> &lt;head&gt;<br /> &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;<br /> &lt;title&gt;File Upload&lt;/title&gt;<br /> &lt;style type="text/css"&gt;<br /> &lt;!--<br /> .topic {color: #FF0000; font-size: 1.5em; font-weight: bold}<br /> --&gt;<br /> &lt;/style&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br /> &lt;p class="topic"&gt;檔案上傳</p><br /> <br /> &lt;form name="upload" enctype="multipart/form-data" method="post" action="fileupload_control.jsp"&gt; <br /> <p>上傳檔案： &lt;input type="file" name="file" size="20" maxlength="20" /&gt; </p><br /> <p>檔案說明： &lt;input type="text" name="filedesc" size="30" maxlength="50" /&gt; </p><br /> <p> &lt;input type="submit"value="上傳" /&gt; &lt;input type="reset" value="清除" /&gt; </p><br /> &lt;/form&gt;<br /> <br /> &lt;/body&gt;<br /> &lt;/html&gt;<br /> [/code]<br /> <br /> fileupload_control.jsp:<br /> [code]<br /> &lt;%@ page contentType="text/html; charset=UTF-8"%&gt;<br /> &lt;%@ page import="java.io.File"%&gt;<br /> &lt;%@ page import="java.util.Iterator"%&gt;<br /> &lt;%@ page import="java.util.List"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.*"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%&gt;<br /> &lt;%@ page import="org.apache.commons.io.FilenameUtils"%&gt;<br /> &lt;%!<br />     int yourMaxMemorySize = 1024 * 1024 * 1024;<br /> 	File yourTempDirectory = new File("/tmp");<br /> 	int yourMaxRequestSize = 100 * 1024 * 1024;<br /> 	boolean writeToFile = true;<br /> 	String allowedFileTypes = ".txt .pdf .doc .ppt .xls .csv .dbf .gif .jpg .jpeg .png .swf .htm .html .zip .rar";<br /> %&gt;<br /> &lt;%<br /> 	String saveDirectory = application.getRealPath("/upload");<br /> <br /> 	// Check that we have a file upload request<br /> 	boolean isMultipart = ServletFileUpload.isMultipartContent(request);<br /> 	out.println("isMultipart=" + isMultipart + "&lt;br&gt;");<br /> <br /> 	// Create a factory for disk-based file items<br /> 	DiskFileItemFactory factory = new DiskFileItemFactory(yourMaxMemorySize, yourTempDirectory);<br /> 	<br /> 	// Create a new file upload handler<br /> 	ServletFileUpload upload = new ServletFileUpload(factory);<br /> <br /> 	// Set overall request size constraint<br /> 	upload.setSizeMax(yourMaxRequestSize);<br /> <br /> 	//Create a progress listener<br /> 	ProgressListener progressListener = new ProgressListener() {<br /> 		private long megaBytes = -1;<br /> <br /> 		public void update(long pBytesRead, long pContentLength, int pItems) {<br /> 			long mBytes = pBytesRead / 1000000;<br /> 			if (megaBytes == mBytes) {<br /> 				return;<br /> 			}<br /> 			megaBytes = mBytes;<br /> 			System.out.println("We are currently reading item "	+ pItems);<br /> 			if (pContentLength == -1) {<br /> 				System.out.println("So far, " + pBytesRead	+ " bytes have been read.");<br /> 			} else {<br /> 				System.out.println("So far, " + pBytesRead + " of "	+ pContentLength + " bytes have been read.");<br /> 			}<br /> 		}<br /> 	};<br /> 	upload.setProgressListener(progressListener);<br /> <br /> 	try {<br /> 		// Parse the request<br /> 		List /* FileItem */items = upload.parseRequest(request);<br /> <br /> 		// Process the uploaded items<br /> 		Iterator iter = items.iterator();<br /> 		while (iter.hasNext()) {<br /> 			FileItem item = (FileItem) iter.next();<br /> <br /> 			if (item.isFormField()) {<br /> 				// Process a regular form field	<br /> 				//processFormField(item);		<br /> 				String name = item.getFieldName();<br /> 				String value = item.getString("UTF-8");<br /> 				out.println(name + "=" + value + "&lt;br /&gt;");<br /> 			} else {<br /> 				// Process a file upload<br /> 				//processUploadedFile(item);						<br /> 				String fieldName = item.getFieldName();<br /> 				String fileName = item.getName();<br /> 				String contentType = item.getContentType();<br /> 				boolean isInMemory = item.isInMemory();<br /> 				long sizeInBytes = item.getSize();<br /> 				out.println("fieldName=" + fieldName + "&lt;br /&gt;");<br /> 				out.println("fileName=" + fileName + "&lt;br /&gt;");<br /> 				out.println("contentType=" + contentType + "&lt;br /&gt;");<br /> 				out.println("isInMemory=" + isInMemory + "&lt;br /&gt;");<br /> 				out.println("sizeInBytes=" + sizeInBytes + "&lt;br /&gt;");<br /> 				if (fileName != null && !"".equals(fileName)) {<br /> 					if (writeToFile) {<br /> 						fileName = FilenameUtils.getName(fileName);<br /> 						out.println("fileName to be saved=" + fileName + "&lt;br /&gt;");<br /> 						String extension = FilenameUtils.getExtension(fileName);<br /> 						if (allowedFileTypes.indexOf(extension.toLowerCase()) != -1) {<br /> 						    File uploadedFile = new File(saveDirectory,	fileName);						<br /> 						    item.write(uploadedFile);<br /> 						} else {<br /> 							out.println("上傳的檔案不能是" + extension + "&lt;br /&gt;");<br /> 						}<br /> 					} else {<br /> 						//InputStream uploadedStream = item.getInputStream();<br /> 						//...<br /> 						//uploadedStream.close();<br /> 						// Process a file upload in memory<br /> 						byte[] data = item.get();<br /> 						out.println("data size=" + data.length + "&lt;br /&gt;");<br /> 					}<br /> 				}<br /> 			}<br /> 		}<br /> 	} catch (FileUploadBase.SizeLimitExceededException ex1) {<br /> 		out.println("上傳檔案超過最大檔案允許大小" + yourMaxRequestSize / (1024 * 1024) + "MB !");<br /> 	}<br /> %&gt;<br /> [/code]<br /> <br /> 另外需要在web.xml中加上下列設定：<br /> [code=xml]<br /> &lt;web-app&gt;<br />   ...<br />   &lt;listener&gt;<br />     &lt;listener-class&gt;<br />       org.apache.commons.fileupload.servlet.FileCleanerCleanup<br />     &lt;/listener-class&gt;<br />   &lt;/listener&gt;<br />   ...<br /> &lt;/web-app&gt;<br /> [/code]<br /> 參考資料：<br /> http://commons.apache.org/fileupload/using.html ]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/562.page</guid>
				<link>http://www.andowson.com/posts/preList/197/562.page</link>
				<pubDate><![CDATA[Mon, 23 Feb 2009 03:18:12]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 版大您好，請問一下為什麼我會出現這種錯誤<br /> 我用tomcat 6.0，win XP sp3 上面的JAR檔也已丟至正確資料夾，<br /> 感覺好像是request的問題，麻煩您幫忙解決一下。 感謝<br /> <br /> org.apache.jasper.JasperException: An exception occurred processing JSP page /test/fileupload.jsp at line 25<br /> <br /> 22: <br /> 23:     // Check that we have a file upload request<br /> 24: <br /> 25:     boolean isMultipart = ServletFileUpload.isMultipartContent(request);<br /> 26: <br /> 27:    out.println("isMultipart="+isMultipart+"&lt;br&gt;");<br /> 28: ]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/694.page</guid>
				<link>http://www.andowson.com/posts/preList/197/694.page</link>
				<pubDate><![CDATA[Tue, 24 Nov 2009 16:38:37]]> GMT</pubDate>
				<author><![CDATA[ hannibal0416]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ hannibal0416您好：<br /> 基本上您給的資訊太少，並不足以判斷問題出在哪裡，可能得請您再花點耐性，把Tomcat的log檔內容看一下，也許就可以找到原因了。]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/695.page</guid>
				<link>http://www.andowson.com/posts/preList/197/695.page</link>
				<pubDate><![CDATA[Tue, 24 Nov 2009 20:54:23]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 由於有網友在問哪段可以取到上傳網頁的檔案說明的欄位的值？簡單說明如下：<br /> <br /> 上傳網頁的檔案說明的欄位，包在第一個if內，註解有註明是regular form field那段，可以透過欄位名稱比對取得其值： <br /> <br /> [code]String fileDesc = null;<br /> ...<br /> if (item.isFormField()) {  <br />     // Process a regular form field  <br />     //processFormField(item);  <br />     String name = item.getFieldName();  <br />     String value = item.getString("UTF-8");  <br />     out.println(name + "=" + value+"<br>"); <br />     if ("filedesc".equals(name)) {<br />        fileDesc = value;<br />    } <br /> } else {<br /> ...[/code]<br /> <br /> 另外如果有需要刪除檔案時，可以參考下列的範例（例如要刪除已上傳的檔案）<br /> [code]        // Delete a file<br />         public static boolean deleteFile(String filename) {          <br /> 			File f = new File(filename);<br /> 			boolean result = false;<br /> 			if (f.exists()) {<br /> 				result = f.delete();<br /> 				if (result != true) {<br /> 					System.out.println("Delete file failed: " + f.getName());<br /> 				}<br /> 			}<br /> 			return result;<br />         }[/code]]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/735.page</guid>
				<link>http://www.andowson.com/posts/preList/197/735.page</link>
				<pubDate><![CDATA[Wed, 13 Jan 2010 21:20:12]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 如果一次上傳多個檔案，然後要分別儲存上傳的檔案名稱和說明欄資料，可以參考這個範例。<br /> 程式碼：<br /> fileupload_streaming.html: <br /> [code=html]<br /> &lt;html&gt;<br /> &lt;head&gt;<br /> &lt;title&gt;File Upload&lt;/title&gt;<br /> &lt;meta http-equiv="Content-Type" content="text/html; charset=big5"&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br /> <p><font size="5"color="#FF0000"><b>檔案上傳</b></font></p><br /> <br /> &lt;form name="upload" enctype="multipart/form-data" method="post" action="fileupload_streaming.jsp"&gt; <br /> <p>上傳檔案： &lt;input type="file" name="file" size="20" maxlength="20"&gt; </p><br /> <p>檔案說明： &lt;input type="text" name="filedesc" size="30" maxlength="50"&gt; </p><br /> <p>上傳檔案： &lt;input type="file" name="file" size="20" maxlength="20"&gt; </p><br /> <p>檔案說明： &lt;input type="text" name="filedesc" size="30" maxlength="50"&gt; </p><br /> <p> &lt;input type="submit"value="上傳"&gt; &lt;input type="reset" value="清除"&gt; </p><br /> &lt;/form&gt;<br /> <br /> &lt;/body&gt;<br /> &lt;/html&gt;<br /> [/code]<br /> <br /> fileupload_streaming.jsp: <br /> [code=java]<br /> &lt;%@ page contentType="text/html; charset=UTF-8"%&gt;<br /> &lt;%@ page import="java.io.*"%&gt;<br /> &lt;%@ page import="java.util.*"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.*"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.util.Streams"%&gt;<br /> &lt;%@ page import="org.apache.commons.io.FilenameUtils"%&gt;<br /> &lt;%<br />     String saveDirectory = application.getRealPath(&quot;/upload&quot;);<br />     <br />     // Check that we have a file upload request<br />     boolean isMultipart = ServletFileUpload.isMultipartContent(request);<br />     out.println(&quot;isMultipart=&quot;+isMultipart+&quot;&lt;br&gt;&quot;);<br />     <br />     // Create a new file upload handler<br />     ServletFileUpload upload = new ServletFileUpload();<br /> <br />     //Create a progress listener<br />     ProgressListener progressListener = new ProgressListener(){<br />        private long megaBytes = -1;<br />        public void update(long pBytesRead, long pContentLength, int pItems) {<br />            long mBytes = pBytesRead / 1000000;<br />            if (megaBytes == mBytes) {<br />                return;<br />            }<br />            megaBytes = mBytes;<br />            System.out.println(&quot;We are currently reading item &quot; + pItems);<br />            if (pContentLength == -1) {<br />                System.out.println(&quot;So far, &quot; + pBytesRead + &quot; bytes have been read.&quot;);<br />            } else {<br />                System.out.println(&quot;So far, &quot; + pBytesRead + &quot; of &quot; + pContentLength<br />                                   + &quot; bytes have been read.&quot;);<br />            }<br />        }<br />     };<br />     upload.setProgressListener(progressListener);<br /> <br />     // Parse the request<br />     List&lt;String&gt; fileDescList = new ArrayList&lt;String&gt;();<br />     List&lt;String&gt; fileNameList = new ArrayList&lt;String&gt;();<br />     FileItemIterator iter = upload.getItemIterator(request);<br />     while (iter.hasNext()) {<br />         FileItemStream item = iter.next();<br />         String name = item.getFieldName();<br />         InputStream stream = item.openStream();<br />         if (item.isFormField()) {<br />             String value = Streams.asString(stream);<br />             out.println(name + "=" + value+"<br>");<br />             if ("filedesc".equals(name)) {<br />                 fileDescList.add(value);<br />             } <br />         } else {<br />             System.out.println("File field " + name + " with file name "<br />                 + item.getName() + " detected.");<br />             // Process the input stream<br />             String fieldName = item.getFieldName();<br />             String fileName = item.getName();<br />             String contentType = item.getContentType();<br />             out.println("fieldName="+fieldName+"<br>");<br />             out.println("fileName="+fileName+"<br>");<br />             out.println("contentType="+contentType+"<br>");<br />             if (fileName != null && !"".equals(fileName)) {<br />                 fileName= FilenameUtils.getName(fileName);<br />                 out.println("fileName saved="+fileName+"<br>&quot;);<br />                 fileNameList.add(fileName);<br />                 File uploadedFile = new File(saveDirectory, fileName);<br />                 FileOutputStream uploadedFileStream = <br />                     new FileOutputStream(uploadedFile);<br />                 Streams.copy(stream, uploadedFileStream, true);<br />             }<br />         }<br />     }<br />     for (int i = 0; i &lt; fileNameList.size(); i++) {<br />     	String fileDesc = fileDescList.get(i);<br />     	String fileName = fileNameList.get(i);<br />     	out.println(fileName+&quot;:&quot;+fileDesc+&quot;<br>&quot;);<br />     	// save to database for future use<br />     }<br /> %&gt;<br /> [/code]]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/736.page</guid>
				<link>http://www.andowson.com/posts/preList/197/736.page</link>
				<pubDate><![CDATA[Thu, 14 Jan 2010 13:57:24]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 請問板大，檔案上傳時的說明(filedesc)輸入中文會出現亂碼，這該如何解決呢??]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/737.page</guid>
				<link>http://www.andowson.com/posts/preList/197/737.page</link>
				<pubDate><![CDATA[Thu, 14 Jan 2010 17:15:02]]> GMT</pubDate>
				<author><![CDATA[ victer0327]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 感謝版大的分享,<br /> <br /> 本人是jsp, java 新手, <br /> 剛剛正想在功課加上上傳的功能 , 搜尋之下 , 找到你的主題, 我真的太幸運了 ^^<br /> <br /> 在網上找了一下, 找不到明確的方法,<br /> 所以想問問 安裝函式庫 該怎安裝 ?<br /> <br /> 我正使用eclipse + tomcat 4.1 <br /> <br /> 在Apache Commons的網站我下載了<br /> commons-io-1.4-src.zip    &amp;   commons-fileupload-1.2.1-src.zip<br /> <br /> 解壓後 發現內有很多不同的檔案,<br /> <br /> 我是應該把以下兩個目錄個的檔案, 全部複製到我eclipse 的Project 內 ?<br /> commons-fileupload-1.2.1-src\src\java\org<br /> 和<br /> commons-io-1.4-src\src\java\org\<br /> <br /> <br /> 謝謝你 ^^]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/738.page</guid>
				<link>http://www.andowson.com/posts/preList/197/738.page</link>
				<pubDate><![CDATA[Thu, 14 Jan 2010 17:25:33]]> GMT</pubDate>
				<author><![CDATA[ A-man]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ [quote=victer0327]請問板大，檔案上傳時的說明(filedesc)輸入中文會出現亂碼，這該如何解決呢??[/quote]<br /> 試著自己找答案看看，一般通常就是編碼的問題，可以查查看API中有沒有和原來使用的method同樣名稱，但多了一個encoding之類的參數的method。<br /> API的網址如下：<br /> http://commons.apache.org/fileupload/apidocs/index.html<br /> <br /> 在Streams類別中有個asString 的method，描述如下：<br /> static java.lang.String asString(java.io.InputStream pStream, java.lang.String pEncoding) <br />           This convenience method allows to read a FileItemStream's content into a string, using the given character encoding. <br /> <br /> 試著把原來的程式中的<br /> [code]String value = Streams.asString(stream);  [/code]<br /> 改為<br /> [code]String encoding = "UTF-8";<br /> String value = Streams.asString(stream, encoding);  [/code]<br /> 看看，如果不行再依序調整encoding的值為"Big5", "MS950", "ISO-8859-1", ...<br /> ]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/739.page</guid>
				<link>http://www.andowson.com/posts/preList/197/739.page</link>
				<pubDate><![CDATA[Thu, 14 Jan 2010 18:17:18]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ [quote=A-man]<br /> 在網上找了一下, 找不到明確的方法,<br /> 所以想問問 安裝函式庫 該怎安裝 ?<br /> <br /> 我正使用eclipse + tomcat 4.1 <br /> <br /> 在Apache Commons的網站我下載了<br /> commons-io-1.4-src.zip    &amp;   commons-fileupload-1.2.1-src.zip<br /> <br /> 解壓後 發現內有很多不同的檔案,<br /> <br /> 我是應該把以下兩個目錄個的檔案, 全部複製到我eclipse 的Project 內 ?<br /> commons-fileupload-1.2.1-src\src\java\org<br /> 和<br /> commons-io-1.4-src\src\java\org\<br /> <br /> <br /> 謝謝你 ^^[/quote]<br /> A-man您應該只需要放jar檔到lib目錄下就好，去下載binary的版本吧！]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/740.page</guid>
				<link>http://www.andowson.com/posts/preList/197/740.page</link>
				<pubDate><![CDATA[Thu, 14 Jan 2010 18:28:34]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 嘗試把jar檔加入IDE 和 直接將 java source放進去 , <br /> 上傳能正確運作, 不過在兩個class發現錯誤<br /> <br /> 如下圖, class 內有數個相同的Error <br /> <br /> 我使用的是 j2sdk-1_4_2_17   &amp;   apache-tomcat-4.1.40 <br /> <br /> 會不會是因為java 的version問題 ?]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/750.page</guid>
				<link>http://www.andowson.com/posts/preList/197/750.page</link>
				<pubDate><![CDATA[Mon, 18 Jan 2010 10:33:47]]> GMT</pubDate>
				<author><![CDATA[ A-man]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ A-man您好：<br /> 您可以參考這個網址下載相依性的jar檔<br /> <a class="snap_shots" href="http://commons.apache.org/fileupload/dependencies.html" target="_blank" rel="nofollow">http://commons.apache.org/fileupload/dependencies.html</a>]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/751.page</guid>
				<link>http://www.andowson.com/posts/preList/197/751.page</link>
				<pubDate><![CDATA[Mon, 18 Jan 2010 13:19:01]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ To andowson:<br /> <br /> 感謝你的幫忙, 問題解決了, 謝謝 ]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/752.page</guid>
				<link>http://www.andowson.com/posts/preList/197/752.page</link>
				<pubDate><![CDATA[Tue, 19 Jan 2010 15:45:25]]> GMT</pubDate>
				<author><![CDATA[ A-man]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ org.apache.jasper.JasperException: Exception in JSP: /fileupload.jsp:74<br /> <br /> 71:                 fileName= FilenameUtils.getName(fileName);<br /> 72:                 out.println("fileName saved="+fileName+"&lt;br&gt;");<br /> 73:                 File uploadedFile = new File(saveDirectory, fileName);<br /> 74:                 item.write(uploadedFile);<br /> 75:             }            <br /> 76:         }<br /> 77:     }                <br /> <br /> 為什麼會有錯誤??]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/780.page</guid>
				<link>http://www.andowson.com/posts/preList/197/780.page</link>
				<pubDate><![CDATA[Sun, 7 Mar 2010 20:20:03]]> GMT</pubDate>
				<author><![CDATA[ lionsgogo]]></author>
			</item>
			<item>
				<title>JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 請問如果將檔案上傳後<br /> <br /> 如何查詢&lt;將檔案名稱顯示出來&gt;<br /> <br /> 還有怎麼寫一個網頁<br /> <br /> 將查詢到想要的檔案下載下來<br /> <br /> 謝謝你<br /> <br /> 幫這我很大]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/781.page</guid>
				<link>http://www.andowson.com/posts/preList/197/781.page</link>
				<pubDate><![CDATA[Sun, 7 Mar 2010 20:45:09]]> GMT</pubDate>
				<author><![CDATA[ lionsgogo]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ [quote=lionsgogo]org.apache.jasper.JasperException: Exception in JSP: /fileupload.jsp:74<br /> <br /> 71:                 fileName= FilenameUtils.getName(fileName);<br /> 72:                 out.println("fileName saved="+fileName+"&lt;br&gt;");<br /> 73:                 File uploadedFile = new File(saveDirectory, fileName);<br /> 74:                 item.write(uploadedFile);<br /> 75:             }            <br /> 76:         }<br /> 77:     }                <br /> <br /> 為什麼會有錯誤??[/quote]<br /> lionsgogo您好:<br /> 請您檢查一下在您網頁的根目錄下有沒有/upload這個目錄？<br /> 如果沒有的話跑出來的錯誤訊息應該會類似這樣子<br /> [quote]HTTP Status 500 - <br /> <br /> --------------------------------------------------------------------------------<br /> <br /> type Exception report<br /> <br /> message <br /> <br /> description The server encountered an internal error () that prevented it from fulfilling this request.<br /> <br /> exception <br /> <br /> org.apache.jasper.JasperException: An exception occurred processing JSP page /fileupload.jsp at line 74<br /> <br /> 71:                 fileName= FilenameUtils.getName(fileName);<br /> 72:                 out.println("fileName saved="+fileName+"&lt;br&gt;");<br /> 73:                 File uploadedFile = new File(saveDirectory, fileName);<br /> 74:                 item.write(uploadedFile);<br /> 75:             }            <br /> 76:         }<br /> 77:     }                <br /> <br /> <br /> Stacktrace:<br /> 	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)<br /> 	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:404)<br /> 	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)<br /> 	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)<br /> 	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)<br /> <br /> <br /> root cause <br /> <br /> java.io.FileNotFoundException: D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\examples\upload\2009蓮藕粉訂單.txt (系統找不到指定的路徑。)<br /> 	java.io.FileOutputStream.open(Native Method)<br /> 	java.io.FileOutputStream.&lt;init&gt;(Unknown Source)<br /> 	java.io.FileOutputStream.&lt;init&gt;(Unknown Source)<br /> 	org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:416)<br /> 	org.apache.jsp.fileupload_jsp._jspService(fileupload_jsp.java:133)<br /> 	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)<br /> 	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)<br /> 	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)<br /> 	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)<br /> 	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)<br /> 	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)<br /> <br /> <br /> note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.<br /> <br /> <br /> --------------------------------------------------------------------------------<br /> <br /> Apache Tomcat/6.0.20[/quote]<br /> <br /> 請手動建立它，如果是在Linux上請設定為可寫入的權限(chmod 777 upload)。]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/782.page</guid>
				<link>http://www.andowson.com/posts/preList/197/782.page</link>
				<pubDate><![CDATA[Mon, 8 Mar 2010 13:18:11]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 您好 <br />  想請問一下,我用fileupload_control.jsp這個範例程式傳上去的檔案的檔名會變成亂碼<br />  有人知道這是哪裡有問題嗎<br />  <br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/844.page</guid>
				<link>http://www.andowson.com/posts/preList/197/844.page</link>
				<pubDate><![CDATA[Mon, 7 Jun 2010 00:31:17]]> GMT</pubDate>
				<author><![CDATA[ mylipton]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ mylipton您好:<br /> 請問您是在什麼系統環境下執行所產生的問題? 請您提供更多資訊以便大家可以較快得幫忙您。例如<br /> OS版本：<br /> Servlet Container版本：<br /> JDK版本：<br /> 上傳前檔案名稱：<br /> 上傳後檔案名稱：<br /> 參考資料：附上錯誤畫面及有錯誤的程式原始碼。<br /> 另外也請您參考本篇文章先前的討論內容尋找解答。]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/846.page</guid>
				<link>http://www.andowson.com/posts/preList/197/846.page</link>
				<pubDate><![CDATA[Mon, 7 Jun 2010 14:33:56]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ andowson謝謝<br /> 我解決了上傳檔名的問題<br /> 雖然也不清楚怎麼改好的<br /> 就是把big5 UTF-8 那些亂試<br /> 終於試到可以]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/850.page</guid>
				<link>http://www.andowson.com/posts/preList/197/850.page</link>
				<pubDate><![CDATA[Tue, 8 Jun 2010 15:10:17]]> GMT</pubDate>
				<author><![CDATA[ mylipton]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ andowsonsup您好:<br /> 我用了fileupload_streaming.html後，檔案並沒上傳，瀏覽器直接顯示成:<br /> ------------------------------<br /> isMultipart=true<br /> fieldName=file<br /> fileName=1.jpg<br /> contentType=image/jpeg<br /> isInMemory=true<br /> sizeInBytes=782266<br /> fileName to be saved=1.jpg<br /> filedesc=<br /> ----------------------------------<br /> 不知問題要如何解決??<br /> 但我在TOMCAT上是OK的.<br /> OS版本：windows <br /> Servlet Container版本： glassfish<br /> JDK版本： jdk1.6.0_21<br /> 上傳前檔案名稱： 1.jpg<br /> 上傳後檔案名稱： 1.jpg<br /> ]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/898.page</guid>
				<link>http://www.andowson.com/posts/preList/197/898.page</link>
				<pubDate><![CDATA[Wed, 15 Sep 2010 11:34:04]]> GMT</pubDate>
				<author><![CDATA[ shyk]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ shyk您好：<br /> 我下載的是本主題的第二篇文章的附檔fileupload_streaming.html及fileupload_streaming.jsp，然後安裝GlassFish Server Open Source Edition 3.0.1(安裝在C:\glassfishv3)，經過實際測試顯示的畫面如下：<br /> ------------------------------<br /> isMultipart=true<br /> fieldName=file<br /> fileName=1.jpg<br /> contentType=image/jpeg<br /> fileName saved=1.jpg<br /> filedesc=<br /> ------------------------------<br /> 檔案有出現在upload資料夾下，實際的路徑是：<br /> C:\glassfishv3\glassfish\domains\domain1\applications\example\upload<br /> 所以，在GlassFish應該也是沒問題的。（其實，過程中有遇到一個小狀況就是，我用Eclipse把所有的檔案包成一個example.war，原本的example.war裡面明明有放一個upload的空目錄，但是佈署後，該目錄卻消失了，造成上傳失敗，手動建立後，再上傳就成功了）<br /> <br /> 比對你的輸出畫面文字跟我的不太相同，不知道您下載的是哪一篇文章的附檔？您可以檢查一下GlassFish的logs目錄下面的server.log，看看錯誤訊息為何，應該就可以知道問題在哪邊了。]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/899.page</guid>
				<link>http://www.andowson.com/posts/preList/197/899.page</link>
				<pubDate><![CDATA[Thu, 16 Sep 2010 21:56:09]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 請問版大我下載第二個程式，但在上傳時如果檔名是中文會產生??的亂碼，檔案除了檔名外皆正常上傳。<br /> 也試過用不同的檔名編碼來儲存，但是都無法成功儲存中文檔名。<br /> <br /> OS: solaris10<br /> Web Server: Sun GlassFish Enterprise Server v2.1.1<br /> <br /> 感謝]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/951.page</guid>
				<link>http://www.andowson.com/posts/preList/197/951.page</link>
				<pubDate><![CDATA[Thu, 6 Jan 2011 17:43:47]]> GMT</pubDate>
				<author><![CDATA[ aauggogogo]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ aauggogogo您好:<br /> 我想您是由Windows環境將中文檔名的檔案上傳到Solaris的檔案系統，然後看到上傳的檔名變成??的樣子吧？<br /> <br /> 由於我目前手邊沒有Solaris 10的環境，所以我改用Linux環境的經驗來說明，供您參考：<br /> <br /> 首先，參考這篇文章[url=http://www.herongyang.com/Java/System-JVM-and-OS-System-Properties.html]JVM and OS System Properties[/url]，將下列的程式碼編譯成SysProperties.class<br /> <br /> SysProperties.java:<br /> [code]<br /> import java.util.Properties;<br /> <br /> public class SysProperties {<br />    public static void main(String[] args) {<br />       Properties sysProps = System.getProperties();<br />       sysProps.list(System.out);<br />    }<br /> }[/code]<br /> <br /> 然後執行<br /> [code]java SysProperties[/code]<br /> <br /> 可以得到類似下面的輸出<br />  :arrow: Windows:<br /> -- listing properties --<br /> java.runtime.name=Java(TM) SE Runtime Environment<br /> sun.boot.library.path=C:\Program Files\Java\jdk1.6.0_23\jre...<br /> java.vm.version=19.0-b09<br /> java.vm.vendor=Sun Microsystems Inc.<br /> java.vendor.url=http://java.sun.com/<br /> path.separator=;<br /> java.vm.name=Java HotSpot(TM) Client VM<br /> file.encoding.pkg=sun.io<br /> user.country=TW<br /> sun.java.launcher=SUN_STANDARD<br /> sun.os.patch.level=Service Pack 3<br /> java.vm.specification.name=Java Virtual Machine Specification<br /> user.dir=D:\workspace\test<br /> java.runtime.version=1.6.0_23-b05<br /> java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment<br /> java.endorsed.dirs=C:\Program Files\Java\jdk1.6.0_23\jre...<br /> os.arch=x86<br /> java.io.tmpdir=C:\DOCUME~1\user\LOCALS~1\Temp\<br /> line.separator=<br /> <br /> java.vm.specification.vendor=Sun Microsystems Inc.<br /> user.variant=<br /> os.name=Windows XP<br /> sun.jnu.encoding=MS950<br /> java.library.path=C:\Program Files\Java\jdk1.6.0_23\bin...<br /> java.specification.name=Java Platform API Specification<br /> java.class.version=50.0<br /> sun.management.compiler=HotSpot Client Compiler<br /> os.version=5.1<br /> user.home=C:\Documents and Settings\user<br /> user.timezone=<br /> java.awt.printerjob=sun.awt.windows.WPrinterJob<br /> [color=red]file.encoding=MS950[/color]<br /> java.specification.version=1.6<br /> user.name=andowson<br /> java.class.path=D:\workspace\test\bin<br /> java.vm.specification.version=1.0<br /> sun.arch.data.model=32<br /> java.home=C:\Program Files\Java\jdk1.6.0_23\jre<br /> java.specification.vendor=Sun Microsystems Inc.<br /> user.language=zh<br /> awt.toolkit=sun.awt.windows.WToolkit<br /> java.vm.info=mixed mode, sharing<br /> java.version=1.6.0_23<br /> java.ext.dirs=C:\Program Files\Java\jdk1.6.0_23\jre...<br /> sun.boot.class.path=C:\Program Files\Java\jdk1.6.0_23\jre...<br /> java.vendor=Sun Microsystems Inc.<br /> file.separator=\<br /> java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...<br /> sun.cpu.endian=little<br /> sun.io.unicode.encoding=UnicodeLittle<br /> sun.desktop=windows<br /> sun.cpu.isalist=pentium_pro+mmx pentium_pro pentium+m...<br /> <br />  :arrow: Linux:<br /> [andowson@scm ~]$ java SysProperties<br /> -- listing properties --<br /> java.runtime.name=Java(TM) SE Runtime Environment<br /> sun.boot.library.path=/usr/java/jdk1.6.0_23/jre/lib/i386<br /> java.vm.version=19.0-b09<br /> java.vm.vendor=Sun Microsystems Inc.<br /> java.vendor.url=http://java.sun.com/<br /> path.separator=:<br /> java.vm.name=Java HotSpot(TM) Server VM<br /> file.encoding.pkg=sun.io<br /> user.country=TW<br /> sun.java.launcher=SUN_STANDARD<br /> sun.os.patch.level=unknown<br /> java.vm.specification.name=Java Virtual Machine Specification<br /> user.dir=/home/andowson<br /> java.runtime.version=1.6.0_23-b05<br /> java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment<br /> java.endorsed.dirs=/usr/java/jdk1.6.0_23/jre/lib/endorsed<br /> os.arch=i386<br /> java.io.tmpdir=/tmp<br /> line.separator=<br /> <br /> java.vm.specification.vendor=Sun Microsystems Inc.<br /> os.name=Linux<br /> sun.jnu.encoding=UTF-8<br /> java.library.path=/usr/java/jdk1.6.0_23/jre/lib/i386/se...<br /> java.specification.name=Java Platform API Specification<br /> java.class.version=50.0<br /> sun.management.compiler=HotSpot Tiered Compilers<br /> os.version=2.6.18-194.11.1.el5<br /> user.home=/home/andowson<br /> user.timezone=<br /> java.awt.printerjob=sun.print.PSPrinterJob<br /> [color=red]file.encoding=UTF-8[/color]<br /> java.specification.version=1.6<br /> user.name=andowson<br /> java.class.path=.<br /> java.vm.specification.version=1.0<br /> sun.arch.data.model=32<br /> java.home=/usr/java/jdk1.6.0_23/jre<br /> java.specification.vendor=Sun Microsystems Inc.<br /> user.language=zh<br /> java.vm.info=mixed mode<br /> java.version=1.6.0_23<br /> java.ext.dirs=/usr/java/jdk1.6.0_23/jre/lib/ext:/us...<br /> sun.boot.class.path=/usr/java/jdk1.6.0_23/jre/lib/resourc...<br /> java.vendor=Sun Microsystems Inc.<br /> file.separator=/<br /> java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...<br /> sun.cpu.endian=little<br /> sun.io.unicode.en<br /> <br /> 然後觀察file.encoding這個系統屬性的值，可以發現在Windows上是MS950，在Linux上是UTF-8，也就是說JVM預設的編碼將會採用MS950和UTF-8來處理檔案的I/O。故通常都會出現一些錯誤訊息，例如File Not Found或寫檔時，檔名看到一堆??和亂碼。<br /> <br /> 解決的方法：<br /> 目前我是將Linux的預設編碼改為Big5，修改/etc/sysconfig/i18n（ :!: 需要重開機reboot OS）:<br /> [code]LANG="zh_TW.Big5"[/code]<br /> 另外一種方式（沒試過請自行確認）是啟動JVM時加上-Dfile.encoding=MS950或-Dfile.encoding=Big5<br /> <br /> 參考資料：<br /> http://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding<br /> ]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/954.page</guid>
				<link>http://www.andowson.com/posts/preList/197/954.page</link>
				<pubDate><![CDATA[Mon, 10 Jan 2011 10:22:06]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 目前server字集為ISO646-US，由於某些原因，無法允許改變字集。<br /> 因為沒轍了，所以目前想改其他方式(資料庫存中文檔名)解決。<br /> 感謝andowson大大的回覆。<br /> ]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/955.page</guid>
				<link>http://www.andowson.com/posts/preList/197/955.page</link>
				<pubDate><![CDATA[Mon, 10 Jan 2011 17:14:11]]> GMT</pubDate>
				<author><![CDATA[ aauggogogo]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 可以請問一下可以把上傳路徑不要設在tomcat底下嗎?<br /> 可以自己設定檔案路徑嗎?<br /> 例如c:\upload<br /> 謝謝!!]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/956.page</guid>
				<link>http://www.andowson.com/posts/preList/197/956.page</link>
				<pubDate><![CDATA[Wed, 12 Jan 2011 15:16:02]]> GMT</pubDate>
				<author><![CDATA[ kisskevin524]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 中文檔名上傳後變成亂碼或??的問題可以透過指定來源表單的編碼方式修正，另外上傳目錄也可以修改到Tomcat以外的目錄，例如C:\upload下（目錄不存在時也可以自動建立）<br /> 首先將來源表單的charset設為UTF-8<br /> fileupload_streaming.html:<br /> [code]&lt;html&gt;<br /> &lt;head&gt;<br /> &lt;title&gt;File Upload&lt;/title&gt;<br /> &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br /> <p><font size="5"color="#FF0000"><b>檔案上傳</b></font></p><br /> <br /> &lt;form name="upload" enctype="multipart/form-data" method="post" action="fileupload_streaming.jsp"&gt; <br /> <p>上傳檔案： &lt;input type="file" name="file" size="20" maxlength="20"&gt; </p><br /> <p>檔案說明： &lt;input type="text" name="filedesc" size="30" maxlength="50"&gt; </p><br /> <p> &lt;input type="submit"value="上傳"&gt; &lt;input type="reset" value="清除"&gt; </p><br /> &lt;/form&gt;<br /> <br /> &lt;/body&gt;<br /> &lt;/html&gt;[/code]<br /> 處理上傳的程式加上request.setCharacterEncoding(encoding);<br /> fileupload_streaming.jsp:<br /> [code]&lt;%@ page contentType="text/html; charset=UTF-8"%&gt;<br /> &lt;%@ page import="java.io.*"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.*"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%&gt;<br /> &lt;%@ page import="org.apache.commons.fileupload.util.Streams"%&gt;<br /> &lt;%@ page import="org.apache.commons.io.FilenameUtils"%&gt;<br /> &lt;%<br />     //String saveDirectory = application.getRealPath("/upload");<br />     // Change save direcoty to another place outside of Tomcat<br />     String saveDirectory = "C:/upload";<br />     File dir = new File(saveDirectory);<br />     if (!dir.exists()) {<br />     	boolean success = dir.mkdir();<br />         if (success) {<br />             System.out.println("Directory: " + saveDirectory + " created");<br />         } <br />     }<br />     <br />     out.println("file.encoding=" + System.getProperty("file.encoding") + "&lt;br&gt;");<br />         <br />     // Solve Chinese filename problem: use original form encoding<br />     String encoding = "UTF-8";<br />     request.setCharacterEncoding(encoding);<br />     <br />     // Check that we have a file upload request<br />     boolean isMultipart = ServletFileUpload.isMultipartContent(request);<br />     out.println("isMultipart=" + isMultipart + "&lt;br&gt;");<br />     <br />     // Create a new file upload handler<br />     ServletFileUpload upload = new ServletFileUpload();<br /> <br />     //Create a progress listener<br />     ProgressListener progressListener = new ProgressListener(){<br />        private long megaBytes = -1;<br />        public void update(long pBytesRead, long pContentLength, int pItems) {<br />            long mBytes = pBytesRead / 1000000;<br />            if (megaBytes == mBytes) {<br />                return;<br />            }<br />            megaBytes = mBytes;<br />            System.out.println("We are currently reading item " + pItems);<br />            if (pContentLength == -1) {<br />                System.out.println("So far, " + pBytesRead + " bytes have been read.");<br />            } else {<br />                System.out.println("So far, " + pBytesRead + " of " + pContentLength<br />                                   + " bytes have been read.");<br />            }<br />        }<br />     };<br />     upload.setProgressListener(progressListener);<br /> <br />     // Parse the request<br />     FileItemIterator iter = upload.getItemIterator(request);<br />     while (iter.hasNext()) {<br />         FileItemStream item = iter.next();<br />         String name = item.getFieldName();<br />         InputStream stream = item.openStream();<br />         if (item.isFormField()) {<br />             String value = Streams.asString(stream, encoding);<br />             out.println(name + "=" + value + "&lt;br&gt;");<br />         } else {<br />             System.out.println("File field " + name + " with file name "<br />                 + item.getName() + " detected.");<br />             // Process the input stream<br />             String fieldName = item.getFieldName();<br />             String fileName = item.getName();<br />             String contentType = item.getContentType();<br />             out.println("fieldName=" + fieldName + "&lt;br&gt;");<br />             out.println("fileName=" + fileName + "&lt;br&gt;");<br />             out.println("contentType=" + contentType + "&lt;br&gt;");<br />             if (fileName != null && !"".equals(fileName)) {<br />                 fileName = FilenameUtils.getName(fileName);<br />                 out.println("fileName saved=" + fileName + "&lt;br&gt;");<br />                 File uploadedFile = new File(saveDirectory, fileName);<br />                 FileOutputStream uploadedFileStream = <br />                     new FileOutputStream(uploadedFile);<br />                 Streams.copy(stream, uploadedFileStream, true);<br />             }<br />         }<br />     }              <br /> %&gt;<br /> [/code]]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/957.page</guid>
				<link>http://www.andowson.com/posts/preList/197/957.page</link>
				<pubDate><![CDATA[Fri, 14 Jan 2011 01:40:27]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 請問一下<br /> 大大有做過上傳過上百mb的檔案嗎<br /> 上傳大檔似乎會timeout<br /> 謝謝!!]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/1197.page</guid>
				<link>http://www.andowson.com/posts/preList/197/1197.page</link>
				<pubDate><![CDATA[Fri, 13 Jan 2012 16:14:39]]> GMT</pubDate>
				<author><![CDATA[ kisskevin524]]></author>
			</item>
			<item>
				<title>回覆:JSP精選實用範例(二):檔案上傳</title>
				<description><![CDATA[ 實際測試上傳一個1GB多的檔案，確實會出現Read timed out的結果:<br /> [code=plain]So far, 1069001476 of 1073742116 bytes have been read.<br /> We are currently reading item 1<br /> So far, 1070000168 of 1073742116 bytes have been read.<br /> We are currently reading item 1<br /> So far, 1071002992 of 1073742116 bytes have been read.<br /> We are currently reading item 1<br /> So far, 1072001684 of 1073742116 bytes have been read.<br /> We are currently reading item 1<br /> So far, 1073000376 of 1073742116 bytes have been read.<br /> 一月 16, 2012 2:25:28 上午 org.apache.catalina.core.StandardWrapperValve invoke<br /> 嚴重: Servlet.service() for servlet [jsp] in context with path [] threw exception [An exception occurred processing JSP page /fileupload_streaming.jsp at line 65<br /> <br /> 62:                 File uploadedFile = new File(saveDirectory, fileName);<br /> 63:                 FileOutputStream uploadedFileStream =<br /> 64:                     new FileOutputStream(uploadedFile);<br /> 65:                 Streams.copy(stream, uploadedFileStream, true);<br /> 66:             }<br /> 67:         }<br /> 68:     }<br /> <br /> <br /> Stacktrace:] with root cause<br /> java.net.SocketTimeoutException: Read timed out<br />         at java.net.SocketInputStream.socketRead0(Native Method)<br />         at java.net.SocketInputStream.read(Unknown Source)<br />         at java.net.SocketInputStream.read(Unknown Source)<br />         at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:309)<br />         at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:364)<br />         at org.apache.coyote.ajp.AjpProcessor.receive(AjpProcessor.java:331)<br />         at org.apache.coyote.ajp.AbstractAjpProcessor.refillReadBuffer(AbstractAjpProcessor.java:576)<br />         at org.apache.coyote.ajp.AbstractAjpProcessor$SocketInputBuffer.doRead(AbstractAjpProcessor.java:1027)<br />         at org.apache.coyote.Request.doRead(Request.java:422)<br />         at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290)<br />         at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:429)<br />         at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315)<br />         at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:200)<br />         at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:976)<br />         at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:886)<br />         at java.io.InputStream.read(Unknown Source)<br />         at org.apache.commons.fileupload.util.Streams.copy(Streams.java:96)<br />         at org.apache.commons.fileupload.util.Streams.copy(Streams.java:66)<br />         at org.apache.jsp.fileupload_005fstreaming_jsp._jspService(fileupload_005fstreaming_jsp.java:125)<br />         at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)<br />         at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)<br />         at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)<br />         at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)<br />         at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)<br />         at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)<br />         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)<br />         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)<br />         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)<br />         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)<br />         at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)<br />         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)<br />         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)<br />         at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)<br />         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)<br />         at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:333)<br />         at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:219)<br />         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)<br />         at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)<br />         at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)<br />         at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)<br />         at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)<br />         at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)<br />         at java.lang.Thread.run(Unknown Source)[/code]<br /> [quote]HTTP Status 500 -<br /> <br /> type Exception report<br /> <br /> message<br /> <br /> description The server encountered an internal error () that prevented it from fulfilling this request.<br /> <br /> exception<br /> <br /> org.apache.jasper.JasperException: An exception occurred processing JSP page /fileupload_streaming.jsp at line 65<br /> <br /> 62:                 File uploadedFile = new File(saveDirectory, fileName);<br /> 63:                 FileOutputStream uploadedFileStream = <br /> 64:                     new FileOutputStream(uploadedFile);<br /> 65:                 Streams.copy(stream, uploadedFileStream, true);<br /> 66:             }<br /> 67:         }<br /> 68:     }              <br /> <br /> <br /> Stacktrace:<br /> 	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)<br /> 	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:460)<br /> 	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)<br /> 	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)<br /> 	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)<br /> root cause<br /> <br /> java.net.SocketTimeoutException: Read timed out<br /> 	java.net.SocketInputStream.socketRead0(Native Method)<br /> 	java.net.SocketInputStream.read(Unknown Source)<br /> 	java.net.SocketInputStream.read(Unknown Source)<br /> 	org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:309)<br /> 	org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:364)<br /> 	org.apache.coyote.ajp.AjpProcessor.receive(AjpProcessor.java:331)<br /> 	org.apache.coyote.ajp.AbstractAjpProcessor.refillReadBuffer(AbstractAjpProcessor.java:576)<br /> 	org.apache.coyote.ajp.AbstractAjpProcessor$SocketInputBuffer.doRead(AbstractAjpProcessor.java:1027)<br /> 	org.apache.coyote.Request.doRead(Request.java:422)<br /> 	org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290)<br /> 	org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:429)<br /> 	org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315)<br /> 	org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:200)<br /> 	org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:976)<br /> 	org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:886)<br /> 	java.io.InputStream.read(Unknown Source)<br /> 	org.apache.commons.fileupload.util.Streams.copy(Streams.java:96)<br /> 	org.apache.commons.fileupload.util.Streams.copy(Streams.java:66)<br /> 	org.apache.jsp.fileupload_005fstreaming_jsp._jspService(fileupload_005fstreaming_jsp.java:125)<br /> 	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)<br /> 	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)<br /> 	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)<br /> 	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)<br /> 	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)<br /> 	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)<br /> note The full stack trace of the root cause is available in the Apache Tomcat/7.0.23 logs.<br /> <br /> Apache Tomcat/7.0.23[/quote]<br /> 實際上傳的檔案大小如下:<br /> [code=plain]-rw-r--r-- 1 tomcat tomcat 1073094361 2012-01-16 02:25 ppsds.pgf[/code]<br /> 目前我的web.xml中設定如下:<br /> [code=xml]    &lt;session-config&gt;<br />         &lt;session-timeout&gt;10&lt;/session-timeout&gt;<br />     &lt;/session-config&gt;[/code]<br /> 目前我不確定是否跟session-timeout這個值有關係(10分鐘)，不過整個1GB檔案上傳的時間大約有花半小時以上，您可以試試看調整這個參數再測試看看。]]></description>
				<guid isPermaLink="true">http://www.andowson.com/posts/preList/197/1198.page</guid>
				<link>http://www.andowson.com/posts/preList/197/1198.page</link>
				<pubDate><![CDATA[Mon, 16 Jan 2012 02:36:43]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
	</channel>
</rss>
