自己构造http消息体,用HttpConnection实现文件上传, 后台用的是Sinatra框架搞定服务端,很简洁,几行代码,比起servlet快捷不少
package com.hoot.regx; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class Regx { private static final String BOUNDARY = "-----------------7d4a6d158c9"; private static final String TWO_HYPHENS = "--"; private static final String END = "\r\n"; /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { URL url = new URL("http://localhost:4567/upload"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + BOUNDARY); StringBuffer sb = new StringBuffer(); //分解符 sb.append(TWO_HYPHENS + BOUNDARY + END); //设置与上次文件相关信息 sb.append("Content-Disposition: form-data; name=\"myfile\"; filename=\"test.txt\"" + END); //上传文件信息和文件的内容间必须有一个空行 sb.append(END); // Map<String, List<String>> props = conn.getRequestProperties(); // for(Entry<String, List<String>> prop : props.entrySet()){ // System.out.println(prop.getKey() + ":" ); // for(String str : prop.getValue()){ // System.out.print(str); // } // System.out.println(); // } System.out.println(sb.toString()); byte[] data = sb.toString().getBytes(); OutputStream os = conn.getOutputStream(); os.write(data); //一下是文件数据 FileInputStream fis = new FileInputStream(new File("test.txt")); byte[] buf = new byte[1024]; int len = 0; while ((len = fis.read(buf)) > 0) { os.write(buf, 0, len); } String endStr = END + TWO_HYPHENS + BOUNDARY + TWO_HYPHENS + END; byte[] end_data = endStr.getBytes(); System.out.println("<this is file content>"); System.out.println(endStr); os.write(end_data); os.flush(); os.close(); fis.close(); InputStream is = conn.getInputStream(); while ((len = is.read(buf)) > 0) { System.out.write(buf, 0, len); } is.close(); } }
服务器端:
需要安装几个gem
sinatra haml
require 'rubygems' require 'sinatra' require 'haml' get '/' do 'Hello world' end # Handle GET-request (Show the upload form) get "/upload" do haml :upload end # Handle POST-request (Receive and save the uploaded file) post "/upload" do logger.info "#{params}" unless params[:myfile] && (tmpfile = params[:myfile][:tempfile]) && (name = params[:myfile][:filename]) @error = "No file selected" logger.info "params #{@error} file: #{tmpfile} name: #{name} #{params}" return haml(:error) end directory = 'uploads' path = File.join(directory, name) File.open(path, "wb") do |f| f.write(tmpfile.read) end #File.copy(tempfile.path, path) @msg = "#{name}The file was successfully uploaded!" end
够简洁吧,下面我吧两个haml文件也贴一下(haml文件放在在同级目录的views目录下)
upload.haml
%html %body %h1 File uploader! %form(method="post" enctype='multipart/form-data') %input(type='file' name='myfile') %br %input(type='submit' value='Upload!')
error.haml
%html %body %h1 File uploader error!
总结:自己构造Post请求有些繁琐,分隔符间空格很重要,如过看不明白可以用抓包工具传两个小文件 然后看看浏览器构造的请求体是什么格式,然后我们用字符串片接方式构造相同的结构,发送给服务器。
参考资料http://my.oschina.net/u/226973/blog/48897 sinatrarb.comhaml.info
据Google黑板报报道,谷歌今天宣布关闭在中国的音乐搜索服务,并把相关资源转移到其他产品团队之中。关闭的原因是,该产品推出后影响力未达预期。
2008年8月初,巨鲸音乐网与谷歌中国合作,尝试在谷歌中国的整合搜索中推出音乐搜索的试验版,这也是谷歌在全球的首次探索。一年后,谷歌音乐搜索正式版推出,这个音乐搜索服务,当时也被看作是加强本地化、进一步与百度争夺中国用户的举措。
当时的谷歌音乐搜索是一种和百度不同的音乐服务运作模式的实验,用户无需为正版音乐付费。在线音乐广告分成的模式让各方都找到了一个提升用户体验、尊重歌手创作、尊重版权之间的平衡。
现在,随着谷歌音乐搜索的关闭,用户访问后只能看到一个提示:谷歌音乐搜索服务已经关闭,请您在10月21日之前登录并下载保存播放列表。
目前,Google.cn域名下只提供时惠、购物、翻译三个服务。
以下是谷歌关闭中国地区音乐搜索服务的全文:
关闭在中国的音乐搜索服务
2012年9月21日 上午 10:10:00
发表者:Google中国工程研究总经理杨文洛博士
我们致力于打造可以真正改变人们生活的优秀产品。在这个过程中,规划重点和优先次序是成功的关键—— 这意味着你不仅要仔细考虑应该开展哪些工作、同时也要仔细考虑应该停止哪些工作 —— 两者同等重要。这就是为什么在过去一年中,我们决定关闭一些产品,并把另外一些产品加以整合,使其成为现有产品的某些功能。
作为这一过程的延续,我们决定关闭在中国的音乐搜索服务,把工作重点转向更具影响力的产品。2009年3月,我们发布了与巨鲸音乐网(Top100.cn)合作的Google音乐搜索,旨在为中国用户提供免费、合法的高品质音乐。但是,这款产品的影响力并不如我们所期待的那么高,因此我们决定把资源转到其他产品上。用户可在2012年10月19日之前登录并下载其保存的播放列表。而所有该项目的员工都将转到其他产品团队去工作。
我们从不畏惧去尝试那些大胆的、勇敢的创新想法,未来也会继续这样做。我们将继续研发有趣的、潜力巨大的新技术。通过更有效地整合资源,我们能更专注于打造改变世界的产品,为用户带来真正美好的体验。
中国软件业在它发展了20几年后,竟然还是只得到一句“依然稚嫩”的评语。这些人说,政府制定了一系列扶持政策并未改变软件产业积贫积弱的现状,也没有催生出具有国际竞争力的大型软件企业。他们为这样的状况感到悲哀。
如果一个活了20多岁,胡子拉碴的青年人,还被人家说幼稚,不知道该不该尴尬。在这些人空对空地评价软件发展时,我在暗自为中国软件从业人员哭泣。
软件业得到政府的扶持,就一定可以发展吗?发展取决于市场、人才、环境、政策等综合因素。扶持,是经济上还是偏向性上?如果是经济上,那和以前对待贫困山区和西部的做法雷同,钱解决不了根本问题。如果是偏向,采购上的简单认同,反而是扼杀。如果采购者不是很认真地对待所采购的软件,只是因为“国产软件”而支持;如果软件企业没有把注意力集中到认真尽力地去提供高质量的软件和服务上,软件业能发展吗?买卖双方大家马马虎虎把合同一验收就完了。这样产品质量怎么会改变?
有位软件人的比喻相当深刻:软件企业好比一个餐馆,来的食客如果都是凑凑合合的,那这个餐馆师傅的水平绝对提不高如果一两个挑剔的食客也被餐馆老板采用诸如免费、说好话等方式糊弄过去,而不是虚心采纳合理建议,怎么可能改进厨艺?
然而,改进本身也不容易。改变靠的是人,因为软件产品的好坏大部分是由开发者决定的。可怜我们那些真正有积极性和创造力的软件人,并没有得到重视,高强度加班,流动频繁,没有良好充足的培训......软件人身心疲惫,对企业缺乏归属感。试想,一个在一年内要两次以上集体换血的软件企业,竞争力能强吗?扪心自问,国内有几个企业的软件人,能像在IBM工作的人一样,一待25年?无法留住人才的企业,凭什么来保证软件人的创造激情?
知识产权的保护也是让软件人痛心的地方,盗版依然猖獗,技术依然不是秘密。金山软件坚持通用软件多年始终做不大,为什么,去问问路边的盗版摊主,他最清楚。虽然说软件发行量到达一定程度,研发成本就会接近零,然而我们的软件人,辛苦所做的东西,比得过几块钱一张光盘的发行速度吗?可怜啊!
软件业不需要输血,需要的是对人才的重视;软件业不需要同情,需要的是公平竞争;软件业更不需要盲从其他国家的模式,毕竟我们得适合中国国情。倘若不能从根本上改变这一切,中国软件人,我只能为你哭泣。