<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GSpace</title>
	<atom:link href="http://blog.deepgully.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.deepgully.com</link>
	<description>gully&#039;s space</description>
	<lastBuildDate>Wed, 04 Apr 2012 05:25:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>GAE Photos V1.02 发布了</title>
		<link>http://blog.deepgully.com/gae-photos-v1-02-released/</link>
		<comments>http://blog.deepgully.com/gae-photos-v1-02-released/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 05:24:01 +0000</pubDate>
		<dc:creator>gully</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web/Django/GAE]]></category>
		<category><![CDATA[gaephotos]]></category>
		<category><![CDATA[网络相册]]></category>

		<guid isPermaLink="false">http://blog.deepgully.com/?p=85</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>GAEPhotos V1.02 更新: 1. 支持 ATOM feed. 2. 支持匿名评论.(默认关闭) 3. 增加图片详细信息. 4. 支持相册备份, 你现在可以下载整个相册了. 5. 修复了一些bugs. 下载地址: http://code.google.com/p/gaephotos/downloads/list 项目地址: http://code.google.com/p/gaephotos/ Demo地址: http://gaephotos.deepgully.com]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><p>GAEPhotos V1.02 更新:<br />
1. 支持 ATOM feed.<br />
2. 支持匿名评论.(默认关闭)<br />
3. 增加图片详细信息.<br />
4. 支持相册备份, 你现在可以下载整个相册了.<br />
5. 修复了一些bugs.</p>
<p>下载地址: <a href="http://code.google.com/p/gaephotos/downloads/list">http://code.google.com/p/gaephotos/downloads/list</a><br />
项目地址: <a href="http://code.google.com/p/gaephotos/">http://code.google.com/p/gaephotos/</a><br />
Demo地址: <a href="http://gaephotos.deepgully.com">http://gaephotos.deepgully.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deepgully.com/gae-photos-v1-02-released/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>GAEPhotos V1.01 发布了</title>
		<link>http://blog.deepgully.com/gaephotos_v1_01_released/</link>
		<comments>http://blog.deepgully.com/gaephotos_v1_01_released/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 11:43:06 +0000</pubDate>
		<dc:creator>gully</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Web/Django/GAE]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[gaephotos]]></category>

		<guid isPermaLink="false">http://blog.deepgully.com/?p=86</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>下载地址: http://code.google.com/p/gaephotos/downloads/list 或 https://github.com/deepgully/GAEPhotos/downloads 演示地址: http://gaephotos.deepgully.com V1.01更新: 基于GAE新计费政策优化. 使用 Blobstore 代替 Datastore , 免费空间增加到5G. 使用 Python27 和 HRD(High Replication Database) . 支持水印.(默认关) 防盗链支持. (默认关) 默认屏蔽所有搜索引擎, 如需要请自行更改 robots.txt. 用GAEPhotos建立你自己的网络相册: 创建 GAE Python HRD 程序, HRD 是必须的. 从 http://code.google.com/p/gaephotos/downloads/list 下载最新版本的GAEPhotos. 解压到本地目录. 更改 app.yaml 文件的第一行: application: gaephotos2 改成 application: xxxxxx     xxxxxx 是你的GAE app id. 运行 update.bat. (确认 appcfg.py 在你的系统Path) 完成! 访问xxxxxx.appspot.com, [...]]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><p>下载地址: <a href="http://code.google.com/p/gaephotos/downloads/list" target="_blank">http://code.google.com/p/gaephotos/downloads/list</a> 或 <a href="https://github.com/deepgully/GAEPhotos/downloads">https://github.com/deepgully/GAEPhotos/downloads</a></p>
<p>演示地址: <a href="http://gaephotos.deepgully.com/" target="_blank">http://gaephotos.deepgully.com</a></p>
<h4>V1.01更新:</h4>
<ol>
<li>基于GAE新计费政策优化.</li>
<li>使用 Blobstore 代替 Datastore , 免费空间增加到5G.</li>
<li>使用 Python27 和 HRD(High Replication Database) .</li>
<li>支持水印.(默认关)</li>
<li>防盗链支持. (默认关)</li>
<li>默认屏蔽所有搜索引擎, 如需要请自行更改 robots.txt.</li>
</ol>
<h4>用GAEPhotos建立你自己的网络相册:</h4>
<ol>
<li>创建 GAE Python HRD 程序, HRD 是必须的.</li>
<li>从 <a rel="nofollow" href="http://code.google.com/p/gaephotos/downloads/list">http://code.google.com/p/gaephotos/downloads/list</a> 下载最新版本的GAEPhotos.</li>
<li>解压到本地目录.</li>
<li>更改 <em>app.yaml 文件的第一行</em>:</li>
<pre>application: gaephotos2
改成  application: xxxxxx    
xxxxxx 是你的GAE app id.</pre>
<li>运行 update.bat. (确认 appcfg.py 在你的系统Path)</li>
<li>完成!</li>
<li>访问xxxxxx.appspot.com, 上传图片.</li>
</ol>
<h4>PS. 中国大陆用户有两种方法可访问Appspot:</h4>
<ul>
<li> 申请Google Apps( <a title="http://www.google.com/apps" href="http://www.google.com/apps" target="_blank">http://www.google.com/apps</a><strong> </strong>),  绑定域名到GAE应用. 如 <a href="http://gaephotos.deepgully.com/" target="_blank">http://gaephotos.deepgully.com</a></li>
<li> 使用 appsp0t, 请注意是数字&#8217;0&#8242;而不是字母&#8217;o&#8217;.  如 <a href="http://gaephotos2.appsp0t.com/">http://gaephotos2.appsp0t.com/</a></li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deepgully.com/gaephotos_v1_01_released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GAEPhotos V0.4 发布了</title>
		<link>http://blog.deepgully.com/gaephotos-v04-released/</link>
		<comments>http://blog.deepgully.com/gaephotos-v04-released/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 03:24:47 +0000</pubDate>
		<dc:creator>gully</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Web/Django/GAE]]></category>
		<category><![CDATA[gaephotos]]></category>

		<guid isPermaLink="false">http://blog.deepgully.com/?p=73</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>下载地址: http://code.google.com/p/gaephotos/downloads/list 演示地址: http://gaephotos.deepgully.com 支持拖拽上传. 优化cache, 最高达80%的性能提升. 增加计划任务(corn task)和代码缓存. 修复相册管理中的javascript bug. Update 2011-7-6: 更新到V0.42, 解决appspot.com被GFW的问题. http://code.google.com/p/gaephotos/issues/detail?id=7]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><p>下载地址:  <a href="http://code.google.com/p/gaephotos/downloads/list" target="_blank">http://code.google.com/p/gaephotos/downloads/list</a></p>
<p>演示地址: <a href="http://gaephotos.deepgully.com" target="_blank">http://gaephotos.deepgully.com</a></p>
<ol>
<li>支持拖拽上传.</li>
<li>优化cache, 最高达80%的性能提升.</li>
<li>增加计划任务(corn task)和代码缓存.</li>
<li>修复相册管理中的javascript bug.</li>
</ol>
<p><span style="color: #ff0000">Update 2011-7-6: 更新到V0.42, 解决appspot.com被GFW的问题.</span> <a href="http://code.google.com/p/gaephotos/issues/detail?id=7">http://code.google.com/p/gaephotos/issues/detail?id=7</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deepgully.com/gaephotos-v04-released/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>javascript实现拖拽多文件上传(支持firefox/chrome)</title>
		<link>http://blog.deepgully.com/drag_and_drop_upload/</link>
		<comments>http://blog.deepgully.com/drag_and_drop_upload/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 13:46:21 +0000</pubDate>
		<dc:creator>gully</dc:creator>
				<category><![CDATA[Web/Django/GAE]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.deepgully.com/?p=50</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>利用DragAndDrop事件实现拖拽处理,利用FileReader和XMLHttpRequest实现多文件读取和上传,还可以监控上传进度. 1. 实现拖拽主要是利用了dragenter,dragover,dragleave和drop这几个事件. var ddupload = ddupload &#124;&#124; function&#40;&#41;&#123;&#125;; &#160; container = document.getElementsByName&#40;&#34;album&#34;&#41;; savedBackColor = container.style.backgroundColor; container.addEventListener&#40;&#34;dragenter&#34;, function&#40;event&#41;&#123; &#160; &#160; event.stopPropagation&#40;&#41;;event.preventDefault&#40;&#41;; &#160;//跳过浏览器的默认处理 &#160; &#160; container.style.backgroundColor = &#34;red&#34;; &#125;, false&#41;; container.addEventListener&#40;&#34;dragover&#34;, function&#40;event&#41;&#123; //理论上不需要处理这个事件,但实际上不行,否则浏览器还是会调用默认事件 &#160; &#160; event.stopPropagation&#40;&#41;;event.preventDefault&#40;&#41;; &#160; &#160; container.style.backgroundColor = &#34;red&#34;; &#125;, false&#41;; container.addEventListener&#40;&#34;dragleave&#34;, function&#40;event&#41;&#123; &#160; &#160; event.stopPropagation&#40;&#41;;event.preventDefault&#40;&#41;; &#160; &#160; container.style.backgroundColor = savedBackColor; &#125;, false&#41;; container.addEventListener&#40;&#34;drop&#34;, [...]]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><p><strong>利用DragAndDrop事件实现拖拽处理,利用FileReader和XMLHttpRequest实现多文件读取和上传,还可以监控上传进度.</strong></p>
<p>1. 实现拖拽主要是利用了dragenter,dragover,dragleave和drop这几个事件.</p>
<div class="codecolorer-container javascript geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> ddupload <span style="color: #339933;">=</span> ddupload <span style="color: #339933;">||</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> &nbsp;<br />
<br />
container <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;album&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
savedBackColor <span style="color: #339933;">=</span> container.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span><span style="color: #339933;">;</span><br />
container.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;dragenter&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; event.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>event.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #006600; font-style: italic;">//跳过浏览器的默认处理</span><br />
&nbsp; &nbsp; container.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;red&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
container.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;dragover&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
<span style="color: #006600; font-style: italic;">//理论上不需要处理这个事件,但实际上不行,否则浏览器还是会调用默认事件</span><br />
&nbsp; &nbsp; event.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>event.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; container.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;red&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
container.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;dragleave&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; event.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>event.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; container.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span> <span style="color: #339933;">=</span> savedBackColor<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
container.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;drop&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; event.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>event.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; container.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span> <span style="color: #339933;">=</span> savedBackColor<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//drop事件,在这里处理拖进来的文件</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// files = event.dataTransfer.files; 可以得到文件列表</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ddupload.<span style="color: #660066;">processdroppedfile</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>2. 通过FileReader读取文件内容, 请参考 <a href="http://developer.mozilla.org/en/DOM/FileReader">http://developer.mozilla.org/en/DOM/FileReader</a><br />
例子中是读取并显示图片</p>
<div class="codecolorer-container javascript geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ddupload.<span style="color: #660066;">filelimit</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">*</span><span style="color: #CC0000;">1024</span><span style="color: #339933;">*</span><span style="color: #CC0000;">1024</span><span style="color: #339933;">;</span><br />
ddupload.<span style="color: #660066;">filetypes</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;jpg,png,gif,jpeg&quot;</span><span style="color: #339933;">,</span><br />
ddupload.<span style="color: #660066;">processdroppedfile</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> files <span style="color: #339933;">=</span> event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">files</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #006600; font-style: italic;">//得到文件列表</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> files.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>files<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">size</span> <span style="color: #339933;">&lt;</span> ddupload.<span style="color: #660066;">filelimit</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> &nbsp;file <span style="color: #339933;">=</span> files<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">/* check file ext */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; filename <span style="color: #339933;">=</span> file.<span style="color: #000066;">name</span>.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ext <span style="color: #339933;">=</span> filename<span style="color: #009900;">&#91;</span>filename.<span style="color: #660066;">length</span><span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> ddupload.<span style="color: #660066;">filetypes</span>.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span>ext<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; localreader <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> FileReader<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; localreader.<span style="color: #660066;">file</span> <span style="color: #339933;">=</span> file<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; localreader.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//文件读取完成的回调函数, 可以在这里处理上传</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f <span style="color: #339933;">=</span> event.<span style="color: #660066;">target</span>.<span style="color: #660066;">file</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//得到文件对象</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data <span style="color: #339933;">=</span> event.<span style="color: #660066;">target</span>.<span style="color: #660066;">result</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//得到文件内容(raw binary data )</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//上传文件内容</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ddupload.<span style="color: #660066;">processXHR</span><span style="color: #009900;">&#40;</span>f<span style="color: #339933;">,</span> data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; localreader.<span style="color: #660066;">readAsBinaryString</span><span style="color: #009900;">&#40;</span>file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;file size exceed!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #006600; font-style: italic;">/*end if*/</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #006600; font-style: italic;">/*end for*/</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></div>
<p>3. 接下来终于到上传文件了, 利用XMLHttpRequest,<br />
请参考 <a href="http://developer.mozilla.org/cn/XMLHttpRequest">http://developer.mozilla.org/cn/XMLHttpRequest</a></p>
<div class="codecolorer-container javascript geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">//这个是状态回调函数,详细内容请看MDC的文档</span><br />
ddupload.<span style="color: #660066;">on_XHR_state_change_handler</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>xhr<span style="color: #339933;">,</span> evt<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>xhr.<span style="color: #660066;">readyState</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>xhr.<span style="color: #000066;">status</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//上传成功</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//失败处理 &nbsp;:(</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<br />
ddupload.<span style="color: #660066;">processXHR</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> bin<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> xhr <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> XMLHttpRequest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xhrupload <span style="color: #339933;">=</span> xhr.<span style="color: #660066;">upload</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; xhrupload.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;progress&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>event.<span style="color: #660066;">lengthComputable</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> percentage <span style="color: #339933;">=</span> Math.<span style="color: #660066;">round</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>event.<span style="color: #660066;">loaded</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> event.<span style="color: #660066;">total</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//处理上传进度</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; xhr.<span style="color: #660066;">onreadystatechange</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>evt<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; evt.<span style="color: #660066;">file</span> <span style="color: #339933;">=</span> file<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ddupload.<span style="color: #660066;">on_XHR_state_change_handler</span><span style="color: #009900;">&#40;</span>xhr<span style="color: #339933;">,</span> evt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; xhr.<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;POST&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;http://localhost/upload/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//指定POST的URL</span><br />
&nbsp; &nbsp; xhr.<span style="color: #660066;">overrideMimeType</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'text/plain; charset=x-user-defined-binary'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; xhr.<span style="color: #660066;">setRequestHeader</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Content-Disposition'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3366CC;">&quot;{'filename':file.name}&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #006600; font-style: italic;">//附带一些自定义数据</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>xhr.<span style="color: #660066;">sendAsBinary</span><span style="color: #009900;">&#41;</span> xhr.<span style="color: #660066;">sendAsBinary</span><span style="color: #009900;">&#40;</span>bin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #006600; font-style: italic;">//firefox支持sendAsBinary</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">else</span> xhr.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span>file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #006600; font-style: italic;">//chrome(8.0.552.215 beta) 只支持send</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></div>
<p>下面是完整的包<br />
<a href="http://blog.deepgully.com/files/2010/12/ddupload.zip">ddupload.zip</a></p>
<p>使用方法:<br />
1. 实现处理函数</p>
<div class="codecolorer-container javascript geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">'ddupload.js'</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span><br />
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">'text/javascript'</span><span style="color: #339933;">&gt;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> postdata_handler <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> container<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span> &nbsp; <span style="color: #006600; font-style: italic;">/* post data in 'Content-Disposition' */</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">'{&quot;albumid&quot;:&quot;'</span><span style="color: #339933;">+</span> container.<span style="color: #660066;">id</span> <span style="color: #339933;">+</span><span style="color: #3366CC;">'&quot;,&quot;filename&quot;:&quot;'</span><span style="color: #339933;">+</span>file.<span style="color: #000066;">name</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&quot;}'</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> loadedhandler <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>reader_event<span style="color: #339933;">,</span> container<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span> &nbsp; <span style="color: #006600; font-style: italic;">/* handler on local file loaded */</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>reader_event.<span style="color: #660066;">target</span>.<span style="color: #660066;">file</span>.<span style="color: #000066;">name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> progresshandler <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> percentage<span style="color: #339933;">,</span> container<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span> &nbsp; <span style="color: #006600; font-style: italic;">/* handler on upload progress */</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>percentage<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> onupload_success_handler <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>xhr<span style="color: #339933;">,</span> evt<span style="color: #339933;">,</span> container<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span> &nbsp; <span style="color: #006600; font-style: italic;">/* handler on success upload(status = 200) */</span><br />
&nbsp; &nbsp; &nbsp;console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>xhr.<span style="color: #660066;">responseText</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> onupload_success_handler <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>xhr<span style="color: #339933;">,</span> evt<span style="color: #339933;">,</span> container<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span> &nbsp; <span style="color: #006600; font-style: italic;">/* handler on failed upload(status != 200) */</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>xhr.<span style="color: #660066;">responseText</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<br />
window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>evt<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> &nbsp;<span style="color: #006600; font-style: italic;">//绑定onload</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ddupload.<span style="color: #660066;">setup</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'dragtohere'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//这里是ddupload的配置</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; filetypes <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;jpg,png,gif,jpeg&quot;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; filelimit <span style="color: #339933;">:</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">*</span><span style="color: #CC0000;">1024</span><span style="color: #339933;">*</span><span style="color: #CC0000;">1024</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; posturl <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;http://localhost:8080/admin/uploadv2/&quot;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; postdata_handler <span style="color: #339933;">:</span> postdata_handler<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loadedhandler <span style="color: #339933;">:</span> loadedhandler<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; progresshandler <span style="color: #339933;">:</span> progresshandler<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onupload_success_handler <span style="color: #339933;">:</span> onupload_success_handler<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onupload_failed_handler<span style="color: #339933;">:</span> onupload_failed_handler<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></div></div>
<p>2. html代码</p>
<div class="codecolorer-container html4strict geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/style.html"><span style="color: #000000; font-weight: bold;">style</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'text/css'</span>&gt;</span><br />
#dragtohere {<br />
width:152px;<br />
height: 152px;<br />
margin: 20px auto;<br />
border:2pt solid black;<br />
}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/style.html"><span style="color: #000000; font-weight: bold;">style</span></a>&gt;</span><br />
<br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'display-area'</span>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/h2.html"><span style="color: #000000; font-weight: bold;">h2</span></a>&gt;</span>Drag and Drop Upload Sample<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/h2.html"><span style="color: #000000; font-weight: bold;">h2</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'dragtohere'</span>&gt;</span>Drag and Drop to here<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'progressbar'</span>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'result'</span>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.deepgully.com/drag_and_drop_upload/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>嵌套的dict按对象方式操作</title>
		<link>http://blog.deepgully.com/dict_convert_to_struct/</link>
		<comments>http://blog.deepgully.com/dict_convert_to_struct/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 11:14:00 +0000</pubDate>
		<dc:creator>gully</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.deepgully.com/?p=41</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>直接上代码: class Struct&#40;object&#41;: &#160; &#160; def __init__&#40;self, d&#41;: &#160; &#160; &#160; &#160; self.__dict__ = d &#160; &#160; &#160; &#160; def dict_to_struct&#40;d&#41;: &#160; &#160; if isinstance&#40;d, &#40;list, tuple&#41;&#41;: return map&#40;dict_to_struct, d&#41; &#160; &#160; elif not isinstance&#40;d, dict&#41;: return d &#160; &#160; return Struct&#40;dict&#40;&#40;k, dict_to_struct&#40;v&#41;&#41; for &#40;k,v&#41; in d.iteritems&#40;&#41;&#41;&#41; d = &#123;'a': 1, &#160;'b': &#123;'c': 2&#125;, &#160; [...]]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><p>直接上代码:</p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">class</span> Struct<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> d<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: #0000cd;">__dict__</span> <span style="color: #66cc66;">=</span> d<br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
<span style="color: #ff7700;font-weight:bold;">def</span> dict_to_struct<span style="color: black;">&#40;</span>d<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>d<span style="color: #66cc66;">,</span> <span style="color: black;">&#40;</span><span style="color: #008000;">list</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">tuple</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>: <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">map</span><span style="color: black;">&#40;</span>dict_to_struct<span style="color: #66cc66;">,</span> d<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>d<span style="color: #66cc66;">,</span> <span style="color: #008000;">dict</span><span style="color: black;">&#41;</span>: <span style="color: #ff7700;font-weight:bold;">return</span> d<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> Struct<span style="color: black;">&#40;</span><span style="color: #008000;">dict</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>k<span style="color: #66cc66;">,</span> dict_to_struct<span style="color: black;">&#40;</span>v<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: black;">&#40;</span>k<span style="color: #66cc66;">,</span>v<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">in</span> d.<span style="color: black;">iteritems</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
d <span style="color: #66cc66;">=</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'a'</span>: <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> &nbsp;<span style="color: #483d8b;">'b'</span>: <span style="color: black;">&#123;</span><span style="color: #483d8b;">'c'</span>: <span style="color: #ff4500;">2</span><span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span> &nbsp;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #483d8b;">'d'</span>: <span style="color: black;">&#91;</span> <span style="color: black;">&#91;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'s'</span>:<span style="color: #483d8b;">'s'</span><span style="color: #66cc66;">,</span> &nbsp;<span style="color: #483d8b;">'l'</span>: <span style="color: black;">&#91;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;ss&quot;</span>:<span style="color: #483d8b;">&quot;ss&quot;</span><span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#123;</span><span style="color: #483d8b;">'foo'</span>: <span style="color: #483d8b;">&quot;bar&quot;</span><span style="color: black;">&#125;</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: black;">&#125;</span><br />
<br />
x <span style="color: #66cc66;">=</span> dict_to_struct<span style="color: black;">&#40;</span>d<span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>x.<span style="color: black;">a</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>x.<span style="color: black;">b</span>.<span style="color: black;">c</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>x.<span style="color: black;">d</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">foo</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>x.<span style="color: black;">d</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">s</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>x.<span style="color: black;">d</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">l</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">ss</span><span style="color: black;">&#41;</span><br />
<br />
x.<span style="color: black;">d</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">l</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">ss</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;CCC&quot;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>x.<span style="color: black;">d</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">l</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">ss</span><span style="color: black;">&#41;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.deepgully.com/dict_convert_to_struct/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GAE Appspot.com貌似解封了</title>
		<link>http://blog.deepgully.com/appspot_status/</link>
		<comments>http://blog.deepgully.com/appspot_status/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 08:09:29 +0000</pubDate>
		<dc:creator>gully</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Web/Django/GAE]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://blog.deepgully.com/?p=35</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>RT 测试   http://gaephotos.appspot.com Update: 2010-10-13  正常]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><p>RT</p>
<p>测试   <a href="http://gaephotos.appspot.com" target="_blank">http://gaephotos.appspot.com</a></p>
<p>Update:</p>
<p>2010-10-13  正常</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deepgully.com/appspot_status/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GAEPhotos v0.3发布了</title>
		<link>http://blog.deepgully.com/gaephotos_v03/</link>
		<comments>http://blog.deepgully.com/gaephotos_v03/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 17:47:33 +0000</pubDate>
		<dc:creator>gully</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Web/Django/GAE]]></category>
		<category><![CDATA[gaephotos]]></category>

		<guid isPermaLink="false">http://blog.deepgully.com/gaephotos-v0-3%e5%8f%91%e5%b8%83%e4%ba%86/</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>下载地址:  http://code.google.com/p/gaephotos/downloads/list 演示地址: http://gaephotos.deepgully.com 突破GAE的1M文件限制,可以上传超过1M的图片了,最大到8M. 增加批量移动文件和删除文件的支持. 修复了相册不能删除和空相册不能保存信息的bug. 修复了上传文件中断导致相片列表不可用的bug.]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><p>下载地址:  <a href="http://code.google.com/p/gaephotos/downloads/list" target="_blank">http://code.google.com/p/gaephotos/downloads/list</a></p>
<p>演示地址: <a href="http://gaephotos.deepgully.com" target="_blank">http://gaephotos.deepgully.com</a></p>
<ol>
<li>突破GAE的1M文件限制,可以上传超过1M的图片了,最大到8M.</li>
<li>增加批量移动文件和删除文件的支持.</li>
<li>修复了相册不能删除和空相册不能保存信息的bug.</li>
<li>修复了上传文件中断导致相片列表不可用的bug.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.deepgully.com/gaephotos_v03/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>建立你自己的网络相册,基于GAEPhotos</title>
		<link>http://blog.deepgully.com/create_web_photo_album/</link>
		<comments>http://blog.deepgully.com/create_web_photo_album/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 16:21:46 +0000</pubDate>
		<dc:creator>gully</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Web/Django/GAE]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[gaephotos]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://blog.deepgully.com/?p=9</guid>
		<description><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div>很多网络相册都有各种各样的限制, 比如什么容量,流量,外链,活跃程度啊这些乱七八糟的, 还有更恶心的网站给你的图片加上广告, 为什么不建立你自己完全控制的网络相册呢? GAEPhotos是基于免费的Google GAE平台的一款网络相册程序,可以简单,快捷地建立你自己的网络相册,没有任何烦人的限制. 演示地址:  http://gaephotos.deepgully.com 安装 Google App Engine SDK for Python 申请GAE帐号. https://appengine.google.com/ 建立GAE Application, https://appengine.google.com/start/createapp, 记住你申请的application ID, 假设你的ID是abcdfe 下载GAEPhotos:  https://code.google.com/p/gaephotos/downloads/list 解压之后用记事本打开 app.yaml, 把第一行  application: gaephotos 中的 gaephotos改成你刚才申请的application ID 运行update.bat, 按提示输入你的GAE帐号和密码(密码输入时不会显示&#8217;*'). 访问http://abcdfe.appspot.com, 建立相册后就可以上传照片了.(如果出现问题,请等待服务器创建DB indexes, 可以在GAE控制面板中看到状态,可能需要几分钟到一两天) 如果发现问题或者有建议请到 https://code.google.com/p/gaephotos/issues/list 提出. PS: GAE的免费帐号是1G空间,每天1GBytes的流量限制,单个图片的限制是1M, 如果你觉得不够用还可以向google按需购买. PSS:  V0.3版本突破GAE的1M文件限制,可以上传最大到8M的图片了.]]></description>
			<content:encoded><![CDATA[        <div style="text-align:center;margin-top:10px;margin-bottom:15px;">
        <script type="text/javascript"><!--
        google_ad_client = "ca-pub-0297441349139103";
        /* feed_468x60 */
        google_ad_slot = "7402452313";
        google_ad_width = 468;
        google_ad_height = 60;
        //-->
        </script>
        <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
        </script></div><p>很多网络相册都有各种各样的限制, 比如什么容量,流量,外链,活跃程度啊这些乱七八糟的, 还有更恶心的网站给你的图片加上广告,  为什么不建立你自己完全控制的网络相册呢? GAEPhotos是基于免费的Google  GAE平台的一款网络相册程序,可以简单,快捷地建立你自己的网络相册,没有任何烦人的限制.</p>
<p>演示地址: <a href="http://gaephotos.deepgully.com" target="_blank"> http://gaephotos.deepgully.com</a></p>
<ol>
<li>安装 <a href="http://code.google.com/appengine/downloads.html#Google_App_Engine_SDK_for_Python" target="_blank">Google App Engine SDK for Python</a></li>
<li>申请GAE帐号. <a href="https://appengine.google.com/" target="_blank">https://appengine.google.com/</a></li>
<li>建立GAE Application, <a href="https://appengine.google.com/start/createapp" target="_blank">https://appengine.google.com/start/createapp</a>, 记住你申请的application ID, 假设你的ID是abcdfe</li>
<li>下载GAEPhotos:  <a href="https://code.google.com/p/gaephotos/downloads/list" target="_blank">https://code.google.com/p/gaephotos/downloads/list</a></li>
<li>解压之后用记事本打开 <em>app.yaml, 把第一行  application: gaephotos 中的 </em><em>gaephotos改成你刚才申请的application ID</em></li>
<li>运行update.bat, 按提示输入你的GAE帐号和密码(密码输入时不会显示&#8217;*').</li>
<li>访问http://abcdfe.appspot.com, 建立相册后就可以上传照片了.(如果出现问题,请等待服务器创建DB indexes, 可以在GAE控制面板中看到状态,可能需要几分钟到一两天)</li>
<li>如果发现问题或者有建议请到 <a href="https://code.google.com/p/gaephotos/issues/list">https://code.google.com/p/gaephotos/issues/list</a> 提出.</li>
</ol>
<p>PS: GAE的免费帐号是1G空间,每天1GBytes的流量限制,<span style="text-decoration: line-through">单个图片的限制是1M</span>, 如果你觉得不够用还可以向google按需购买.</p>
<p>PSS:  V0.3版本突破GAE的1M文件限制,可以上传最大到8M的图片了.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deepgully.com/create_web_photo_album/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

