日期:2014-05-17  浏览次数:20541 次

phonegap文件上传(Java,PHP)

phpnegap文件上传

phonegap中的FileTransfer对象介绍:

http://docs.phonegap.com/en/1.6.1/cordova_file_file.md.html#FileTransfer

?

今天的代码为同学所整理。在此记下来,供以后参考

?

FileTransfer ? is an object that allows you to upload files to a server or download files from a server.

?

用于传文件到服务器端

?

它里面有示例,写得已经是非常的详细,其中有一段:

var options = new FileUploadOptions();
options.fileKey="file";
options.fileName=fileURI.substr(fileURI.lastIndexOf('/')+1);
options.mimeType="text/plain";

?

前端的完整版可以参考:http://www.oschina.net/question/200138_34919

?

今天在做图片上传的时候,怎整也无法在后端获取文件流,其中的Java逻辑如下:

int MAX_SIZE = 102400 * 102400;

			DataInputStream in = null;
			FileOutputStream fileOut = null;

			String contentType = request.getContentType();
			try {
				if (contentType.indexOf("multipart/form-data") >= 0) {
					in = new DataInputStream(request.getInputStream());
					int formDataLength = request.getContentLength();
					if (formDataLength > MAX_SIZE) {
						return;
					}
					byte dataBytes[] = new byte[formDataLength];
					int byteRead = 0;
					int totalBytesRead = 0;
					while (totalBytesRead < formDataLength) {
						byteRead = in.read(dataBytes, totalBytesRead, formDataLength);
						totalBytesRead += byteRead;
					}
					String file = new String(dataBytes);
					String saveFile = file.substring(file.indexOf("filename=\"") + 10);
					saveFile = saveFile.substring(0, saveFile.indexOf("\n"));
					saveFile = saveFile.substring(saveFile.lastIndexOf("\\") + 1, saveFile.indexOf("\""));
					int lastIndex = contentType.lastIndexOf("=");
					String boundary = contentType.substring(lastIndex + 1,contentType.length());

					int pos;
					pos = file.indexOf("filename=\"");
					pos = file.indexOf("\n", pos) + 1;
					pos = file.indexOf("\n", pos) + 1;
					pos = file.indexOf("\n", pos) + 1;
					int boundaryLocation = file.indexOf(boundary, pos) - 4;
					// 取得文件数据的开始的位置
					int startPos = ((file.substring(0, pos)).getBytes()).length;
					// 取得文件数据的结束的位置
					int endPos = ((file.substring(0, boundaryLocation)).getBytes()).length;

					// 创建文件的写出类
					fileOut = new FileOutputStream(System.getProperty("java.io.tmpdir") + "/aa.jpg");
					// 保存文件的数据
					fileOut.write(dataBytes, startPos, (endPos - startPos));
					fileOut.close();
				} 
			} catch (Exception ex) {
				throw new ServletException(ex.getMessage());
			}

?后来才发现,原来是少了一个致命的参数:options.chunkedMode = false;

?

关于chunkedMode的解析,请看:http://www.issociate.de/board/post/368589/How_to_force_the_apache_transfer_the_data_in_chunked_mode?.html

?

大意是:如果文件长度无法预知时,使用chuckedMode模式传输,现在传输的是图片,大小已经知道,不知道为何apache服务器处理不过来,一定要将chunkedMode设成false,至此上传成功,感觉同学指点

?

为了这个参数,我还对比了php版本的文件上传:php的server端这样写的:

<?php
// Directory where uploaded images are saved
$dirname = "/tmp/phonegap/uploads"; 

// If uploading file
if ($_FILES) {
    print_r($_FILES);
    mkdir ($dirname, 0777, true); 
    move_uploaded_file($_FILES["file"]["tmp_name"],$dirname."/".$_FILES["file"]["name"]);
}

// If retrieving an image
else if (isset($_GET['image'])) {
    $file = $dirname."/".$_GET['image'];

    // Specify as jpeg
    header('Content-type: image/jpeg');
  
    // Resize image for mobile
    list($width, $height) = getimagesize($file); 
    $newWidth = 120.0; 
    $size = $newWidth / $width;
    $newHeight = $height * $size; 
    $resizedImage = imagecreatetruecolor($newWidth, $newHeight); 
    $image = imagecreatefromjpeg($file