手机实现上传文件的方案

针对手机无法直接上传文件的问题,提出了一种通过邮件发送附件到服务器的解决方案。步骤包括生成uuid作为临时文件名,显示邮件发送tag,配置邮件服务器以触发脚本,脚本调用Java程序上传附件到Web服务器,并在用户点击更新后按uuid找到并处理文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大多数手机不支持文件上传控件,无法直接像电脑客户端一样上传文件到服务器。这里考虑通过邮件发送文件到服务器的方式来实现上传。

大概步骤如下:

step 1. 打开上传文件的页面时,生成uuid作为临时文件的名称

step 2. 页面里显示发送邮件的tag,通过邮件标题传递uuid,用户通过发送带附件的邮件来上传文件

step 3. 这一步是重点和难点。

    首先,是配置邮件服务器,在接收到包含了附件的邮件时(某个指定邮件账户test@test.com接收到邮件时),触发脚本(test1.sh)。

    然后,在脚本里面调用Java(Test2.java),传入的参数是接收到的邮件文件路径。

    最后,Java里从邮件文件里读取出附件,然后访问Web服务器,把附件上传到Web服务器,保存为文件名包含uuid的临时文件。

step 4. 在页面点击更新按钮后,根据uuid从临时文件里找到匹配的上传文件,做对应业务处理。


基本思路就是这样子,当然真正去实现肯定要花费一发功夫的。这里写一下大概的实现代码

1. 使用java的java.util.UUID类生成uuid

String s = UUID.randomUUID().toString(); 


2. 页面的发送邮件tag和保持uuid的hidden tag

<a href="mailto:test@test.com?subject=7bcffff4-0f54-442e-8111-d698b88008ed">上传文件</a>
<input type="hidden" name="uuid" value="7bcffff4-0f54-442e-8111-d698b88008ed" />


3.配置邮件服务器,这里以postfix做例子

1) 在/etc/aliases里添加一行脚本来调用新建的脚本 test1.sh。test就是用于接收邮件的邮件账户。

添加完后需要执行newaliases命令重新载入。

test:     "| /usr/local/etc/script/test1.sh"


2)脚本test1.sh,调用java程序Test2,传入的参数TMP_FILE是接收到的邮件文件。

#!/bin/sh

TMP_PATH=/tmp/
LOG_FILE=/tmp/test.log
read -rd '' s;
EXTENTION='_mail.tmp'
TMP_FILE=$TMP_PATH$RANDOM$EXTENTION
echo "$s" >> $TMP_FILE

cd /usr/local/etc/script
/usr/local/jdk6/bin/java -Djava.awt.headless=true -classpath ./:./lib/commons-logging-1.1.1.jar:./lib/httpclient-4.1.2.jar:./lib/httpcore-4.1.2.jar:./lib/httpmime-4.1.2.jar:./lib/mail.jar Test2 $TMP_FILE >> $LOG_FILE

rm -f $TMP_FILE


3)Test2.java的代码主要包含几个部分

a. 从邮件中抽取出附件的文件流、UUID等

String mimeType;
String attachmentOriginalFileName;
InputStream isMailAttachmentFile;
String uuid;
InputStream in = null;
		
try {
	in = new FileInputStream(mailFilePath);
	MimeMessage message = new MimeMessage(null, in);
	Object obj = message.getContent();

	// 取得uuid
	uuid = message.getSubject();

	// 取得附件
	if ((obj instanceof MimeMultipart)) {
		int count = ((MimeMultipart) obj).getCount();
		for (int i = 0; i < count; i++) {
			BodyPart bodyPart = ((MimeMultipart) obj).getBodyPart(i);
			String disposition = bodyPart.getDisposition();
			if (disposition != null && (disposition.equals(Part.ATTACHMENT) 
					|| disposition.equals(Part.INLINE))) {
				mimeType = bodyPart.getContentType();
				attachmentOriginalFileName = bodyPart.getFileName();
				isMailAttachmentFile = bodyPart.getInputStream();
				break;
			}
		}
	} else {
		if (message.getEncoding().equalsIgnoreCase("base64")) {
			mimeType = message.getContentType();
			attachmentOriginalFileName = message.getFileName();
			isMailAttachmentFile = (BASE64DecoderStream) message.getContent();
		}
	}		
} catch (Exception e) {
	e.printStackTrace();
} finally {
	if (in != null) {
		try {
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


b.将附件的文件流保存为临时文件

File mailAttachmentTmpFile = null;
BufferedInputStream fileIn = null;
FileOutputStream fileOut = null;

try {
	mailAttachmentTmpFile = File.createTempFile(tmpFileUUID, ".tmp");
	fileIn = new BufferedInputStream(isMailAttachmentFile);
	fileOut = new FileOutputStream(mailAttachmentTmpFile);
	int data = -1;
	while ((data = fileIn.read()) != -1) {
		fileOut.write(data);
	}
	
	mailAttachmentTmpFile.deleteOnExit();
} catch (Exception e) {
	e.printStackTrace();
} finally {			
	try {
		if (fileOut != null) {
			fileOut.close();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	try {
		if (fileIn != null) {
			fileIn.close();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}

c. 访问Web服务器,将附件上传到Web服务器。使用apache的HttpClient。这里因为Web服务器的接收端是https,所以代码比较复杂。如果是http的话,会简单很多,具体的可以自己去google。

SSLContext sslContext = null;
HttpPost httpPost = null;

try {
	sslContext = SSLContext.getInstance("SSL");
	sslContext.init(null, new TrustManager[] { new X509TrustManager() {
		public X509Certificate[] getAcceptedIssuers() {
			return null;
		}
		public void checkClientTrusted(X509Certificate[] certs,
				String authType) {
		}
		public void checkServerTrusted(X509Certificate[] certs,
				String authType) {
		}
	} }, new SecureRandom());

	SSLSocketFactory socketFactory = new SSLSocketFactory(sslContext, 
			SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
	Scheme httpsScheme = new Scheme("https", 443, socketFactory);
	SchemeRegistry schemeRegistry = new SchemeRegistry();
	schemeRegistry.register(httpsScheme);
	
	ClientConnectionManager cm = new SingleClientConnManager(schemeRegistry);
	HttpClient httpClient = new DefaultHttpClient(cm);
	HttpsURLConnection.setDefaultHostnameVerifier(SSLSocketFactory
			.ALLOW_ALL_HOSTNAME_VERIFIER);
	httpPost = new HttpPost("https://www.test.com/receive");
	
	// post data
	MultipartEntity multipart = new MultipartEntity();
	FileBody fileBody = new FileBody(mailAttachmentTmpFile, 
		attachmentOriginalFileName, mimeType, charset);
	multipart.addPart("answerFile", fileBody);
	StringBody uuidBody = new StringBody(key);
	multipart.addPart("uuid", uuidBody);
	StringBody fileNameBody = new StringBody(URLEncoder
			.encode(attachmentOriginalFileName, charset));
	multipart.addPart("fileName", fileNameBody);
	httpPost.setEntity(multipart);

	// request
	HttpResponse response = httpClient.execute(httpPost);
	StatusLine statusLine = response.getStatusLine();
	
} catch (NoSuchAlgorithmException e) {
	e.printStackTrace();
} catch (KeyManagementException e) {
	e.printStackTrace();
} catch (UnsupportedEncodingException e) {
	e.printStackTrace();
} catch (ClientProtocolException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
} finally {
	if (httpPost != null) {
		httpPost.abort();
	}
}

这是我们公司做手机网站时,上传文件的实现方案。有什么不妥的地方,欢迎指正。也欢迎大家把自己好的方案共享出来,万分感谢。













                
  一.JAVA程序传送到手机的方法:   JAVA程序传送到手机的方法有4种,分别是手机上网直接下载安装,通过电脑下载到本地 后,然后通过读卡器,数据线,蓝牙,红外线传输JAVA程序到手机.具体方法说明如下.   1.手机上网下载:   通过手机上网下载以及使用短信定购的方式,直接在手机的个人文档或者应用程序中找 到(根据手机各不相同),无需在安装,直接可以在类似"我的文件夹"之类的选项找到。   使用电脑下载就需要将文件传送到手机上。   2. 读卡器:   1 新买的卡,先在手机上格式你的 TF 卡:设置 -- 手机状态 -- 存储存储设备 - - 卡 -- 菜单键 -- 格式 OK      或先安装 TF 卡到手机上采取拍照,录象的方式,激活 TF 卡的文件夹。 如果是 已经使用的就不必了...   2 .将我的电脑 -- 工具 - 文件夹选项 - 查看中的,隐藏文件文件夹 -- 选显示   3 .打开我的电脑 -- 工具 - 文件夹选项 - 查看,把 " 隐藏受保护的操作系统文 件 " 前面的勾去掉   4.然后用读卡器打开你的 TF ,就可以看见 TF 卡上的 KJAVA 了。 copy JAVA程序(包 括 *.JAR,*.JAD)到你 TF 卡的 KJAVA 目录里就行了   5 .安装 TF 卡到手机。   6 .进入手机 " 游戏 和应用程序)里安装新的程序 OK   3.数据线传输:   通过安装购买手机时所附带的 软件 安装盘,安装其pc套件,用数据线接上手机与电脑, 通过管理 软件 把JAVA程序文件*.JAD,*.JAR传送到手机上;MIDWAY2.8 也可以传输 JAVA 程序,但是需要开启 JAVA 设置中的 "JAVA 加载器 "     二、安装问题-相关说明 1. 如何安装Kjava程序   JAVA平台的手机软件一般有两个文件,一个是jar,一个是jad。 诺基亚等品牌的机器 需要两个文件都传入手机中才能正常使用。   而索爱等品牌的手机只需要一个jar文件就可以用了。具体情况要根据你自己的手机来 确定。   如果你是下载至电脑本地安装,你的手机需要用到.jad文件才能完成安装. 通过数据 线,红外或蓝牙等方式把两个文件[.jar,.jad]存到手机上同一个目录中即可。      2.如何安装Symbian程序   Symbian软件安装包通常是.sis的压缩文件,其中包含许多组件文件。   安装步骤如下 :   (1) 安装文件可以通过蓝牙连接或红外连接发送至手机.   (2) 在手机收到信息后,打开新信息,选择打开->安装   (3) 按照提示一步一步操作下去,直到安装完成   3.如何安装微软SmartPhone智能手机软件    在使用微软操作系统的SmartPhone上安装软件,有三种方法:   1)直接拷贝法 与电脑类似,在智能手机上也流行"绿色软件"一说。这一类软件只须将相关文件 Copy到手机或存储卡上,然后建立一快捷方式,并将其拖入"Storage\windows\Start Menu" 文件夹。欲使用该软件,只须进入"开始"菜单即可。 小知识:与电脑不同,使用微软操作系统的SmartPhone并未自带资源管理器,因此 须要自行安装,否则无法进行文件操作。推荐使用Explorer 2003。   (2)CAB文件安装法   如果下载的软件为*.CAB格式,那么请先用数据线或者读卡器将该文件Copy到SD卡等 附加储存卡上(不推荐Copy到手机内置闪存上)。然后打开资源管理器(笔者使用的是 Explorer 2003中文版),选中文件按OK键执行安装。一般来说,系统会弹出警告,点击确 定即可。 有的软件可能会选择安装路径,选择安装路径,建议选择将软件安装到储存卡上。安装 完毕后,就可以在开始菜单中找到该软件的快捷方式了。   (3)EXE文件安装法    前两种文件的安装都比较简单,但如果遇到*.EXE文件,那么安装起来就稍显繁复。首 先,必须在电脑里安装Microsoft ActiveSync同步软件;其次,须要一根同步数据线或红外 /蓝牙适配器(推荐使用数据线)。当这两者都齐备后,就可以进行安装了。   Microsoft ActiveSync联线后,双击运行*.EXE文件会看到一个安装界面。选择一个目 录,单击安装,安装文件会自动解压并传送数据至手机。在电脑屏幕上弹出提示时,就要换 为手机操作了。按照手机屏幕上的提醒,选择将软件安装在手机或者储存卡上即可。   安装java程序要有两个文件,一个是JAR和JAD, 但拷贝下来的游戏只
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值