PhoneGap中FileTransfer的上传问题
问题描述:
我无法上传手机拍摄的图像在手机间隙android版本中。 对于iOS,它的工作正常,但相同的代码不适用于Android版本使用手机差距PhoneGap中FileTransfer的上传问题
我得到200响应代码,但没有从服务器的“成功”响应。
我使用的是cordova-1.7.0.js,目标SDK是Android 2.1。
下面是示例代码:
function imageUpload(imageURI)
{
var options = new FileUploadOptions();
options.fileKey="image";
options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1);
options.mimeType="image/jpeg";
var params = new Object();
var msg="test message";
var token= "test token";
params.message = msg;
params.access_token = token;
options.params = params;
var ft = new FileTransfer();
ft.upload(imageURI, "http://mydomain.info/demo/upload.php", win, fail, options,false);
}
答
现在好了,我们是在科尔多瓦-1.9.0还增加Apache库:公地IO-2.4.JARS
我一直在试图上传图片从PhoneGap的Android模拟器到Servlet来存储图像
servlet代码:uploadpic.java
private static final String BASE_DIRECTORY = "/Users/tshah/Pictures";
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// boolean isMultipart = ServletFileUpload.isMultipartContent(request);
System.out.println("Do post....");
/**
* The base upload directory. In this directory all uploaded files will
* be stored. With the applet param tag 'directory' you can create a
* subdirectory for a user.
* See http://www.javaatwork.com/parameters.html#directory for more
* information about the 'directory' param tag. For a Windows environment
* the BASE_DIRECTORY can be e.g. * 'c:/temp' for Linux environment '/tmp'.
*/
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// check if the http request is a multipart request
// with other words check that the http request can have uploaded files
if (isMultipart) {
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
// Set upload parameters
// See Apache Commons FileUpload for more information
// http://jakarta.apache.org/commons/fileupload/using.html
servletFileUpload.setSizeMax(-1);
try {
String directory = "";
// Parse the request
List items = servletFileUpload.parseRequest(request);
// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
// the param tag directory is sent as a request parameter to
// the server
// check if the upload directory is available
if (item.isFormField()) {
String name = item.getFieldName();
if (name.equalsIgnoreCase("directory")) {
directory = item.getString();
}
// retrieve the files
} else {
// the fileNames are urlencoded
String fileName = URLDecoder.decode(item.getName());
File file = new File(directory, fileName+".jpeg");
file = new File(BASE_DIRECTORY, file.getPath());
// retrieve the parent file for creating the directories
File parentFile = file.getParentFile();
if (parentFile != null) {
parentFile.mkdirs();
}
// writes the file to the filesystem
item.write(file);
}
}
} catch (Exception e) {
e.printStackTrace();
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
response.setStatus(HttpServletResponse.SC_OK);
} else {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
}
答
也不要忘记摄像机的权限添加到Android模拟器
HTML代码:
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script type="text/javascript" charset="utf-8" src="cordova-1.9.0.js"></script>
<link rel="stylesheet"
href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" />
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script
src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
<script type="text/javascript">
function PictureSourceType() {};
PictureSourceType.PHOTO_LIBRARY = 0;
PictureSourceType.CAMERA = 1;
function getPicture(sourceType)
{
var options = { quality: 10 };
if (sourceType != undefined) {
options["sourceType"] = sourceType;
// options["destinationType"] = destinationType.DATA_URL;
}
// if no sourceType specified, the default is CAMERA
navigator.camera.getPicture(getPicture_Success, null, options);
};
function getPicture_Success(imageData)
{
alert("getpic success "+ imageData);
document.getElementById("test_img").src = imageData;
};
function success(response) {
alert("Your photo has been uploaded!");
};
// callback if the photo fails to upload successfully.
function fail(error) {
alert("if refreshed An error has occurred: Code = " + error.code);
};
function uploadPhoto()
{
var imageFile = document.getElementById("test_img").src;
alert(imageFile);
var ft,options;
options = new FileUploadOptions();
options.fileKey = "profile_image";
// name of the file:
options.fileName = imageFile.substr(imageFile.lastIndexOf('/') + 1);
// mime type:
options.mimeType = "multipart/form-data";
params = {
val1: "some value",
val2: "some other value"
};
options.params = params;
ft = new FileTransfer();
ft.upload(imageFile, 'http://10.0.2.2:8080/cio/uploadpic', success, fail, options);
alert("There is something called file transfer " + imageFile);
};
</script>
</head>
<body>
<div data-role="page" id="cameraPage">
<div data-role="header" data-position="inline">
<h1>Edit profile Pic</h1>
<a href="index.html" data-icon="delete" class="ui-btn-right">Cancel</a>
</div>
<div data-role="content">
<center>
<img style="width: 60px; height: 60px" id="test_img" src="" />
</center>
<button onclick="getPicture()">From Camera</button>
<button onclick="getPicture(PictureSourceType.PHOTO_LIBRARY)">From
Photo Library</button>
<button onclick="uploadPhoto()">Upload Photo</button>
</div>
</div>
答
首先确保你的doPost方法获取调用 如果它不叫写doGet()方法并在该呼叫中以下列方式发帖
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
doPost(request,response);
}
然后,你需要放置在lib文件夹下面的jar文件在WEB-INF
- 公地文件上传-1.2.2.jar
- 公地文件上传-1.2-javadoc.jar
- 公地文件上传-1.2-sources.jar
- 公地IO-1.3.2.jar
也把他们构建路径。
答
我有同样的问题。我用它添加了代码
System.setProperty("http.keepAlive", "false");
在主java文件中的onCreate()方法开始。 这个bug是apache cordova的unresolved bug。
答
见我的答案在这里,这对我的作品在Android完整的代码(发送图像和数据给Django的REST API):
android phonegap camera and image uploading
我想关键是在:
options.chunkedMode = true; //this is important to send both data and files
,也许这一个:
var url=encodeURI("http://your_url_for_the_post/");
使用URL连接编码的URL传递给FileTransfer
你在“adb logcat”中看到了什么?服务器端日志呢? –
我直接在设备上运行,所以我无法看到关于服务器端的任何日志 我有我的设备发送的Echo值,以便我可以看到值,但没有任何服务器,我得到200只有响应码。 –
https://developer.android.com/guide/developing/tools/adb.html#logcat –