phonegap文件上传(Java,PHP)
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.
?
用于传文件到服务器端
立即学习“PHP免费学习笔记(深入)”;
?
它里面有示例,写得已经是非常的详细,其中有一段:
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("
"));
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("
", pos) + 1;
pos = file.indexOf("
", pos) + 1;
pos = file.indexOf("
", 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"]);
}
<span style="color: #ff0000;">// 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);
imagecopyresampled($resizedImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
imagejpeg($resizedImage, null, 80);
}</span>
// If displaying images
else {
$baseURI = "http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['REQUEST_URI'];
$images = scandir($dirname);
$ignore = Array(".", "..");
if ($images) {
foreach($images as $curimg){
if (!in_array($curimg, $ignore)) {
echo "Image: ".$curimg."<br>";
echo "<img src='".$baseURI."?image=".$curimg."&rnd=".uniqid()."' alt=" phonegap文件下传(Java,PHP) " ><br>";
}
}
}
else {
echo "No images on server";
}
}
?>?php的代码参考:https://github.com/brycecurtis/articles/tree/master/CameraUpload
?
代码说明及解说在:https://www.ibm.com/developerworks/mydeveloperworks/blogs/94e7fded-7162-445e-8ceb-97a2140866a9/entry/upload_a_picture_using_phonegap_on_android8?lang=en
?
php版本的这个前端代码:
// Verify server has been entered
server = document.getElementById('serverUrl').value;
if (server) {
// Specify transfer options
var options = new FileUploadOptions();
options.fileKey="file";
options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1);
options.mimeType="image/jpeg";
<span style="color: #ff0000;">options.chunkedMode = false;</span>
// Transfer picture to server
var ft = new FileTransfer();
ft.upload(imageURI, server, function(r) {
document.getElementById('camera_status').innerHTML = "Upload successful: "+r.bytesSent+" bytes uploaded.";
}, function(error) {
document.getElementById('camera_status').innerHTML = "Upload failed: Code = "+error.code;
}, options);
}?确实是含有chunkedMode=false的设置,并在本机运行通过。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号