在我的应用程序中,我试图从我的设备捕获图像,我想将其上传到服务器。 我正在按照here
发布的答案以下是我启动相机的代码
startBtn = (Button) findViewById(R.id.startBtn);
startBtn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
startCamera();
}
});
}
public void startCamera()
{
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
intent.putExtra( MediaStore.EXTRA_OUTPUT, outputFileUri );
startActivityForResult( intent, 0 );
}
但是在我捕获之后,当我尝试上传时,它会崩溃。在logcat中它显示错误 在 OnActivity结果和 doFileUpload
以下是我的代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch( resultCode )
{
case 0:
break;
case -1:
onPhotoTaken();
break;
}
}
protected void onPhotoTaken()
{
doFileUpload(MediaStore.EXTRA_OUTPUT);
}
private void doFileUpload(String extraOutput)
{
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
DataInputStream inStream = null;
String urlServer = "http:XXXXXXXXXXXXXXXXXXXXXX/upload.php";
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1*1024*1024;
FileInputStream fileInputStream = new FileInputStream(new File(extraOutput) );
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
outputStream = new
DataOutputStream( connection.getOutputStream() );
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"userfile\";filename=\"" + extraOutput +"\"" + lineEnd);
outputStream.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens +lineEnd);
int serverResponseCode = connection.getResponseCode();
String serverResponseMessage = connection.getResponseMessage();
fileInputStream.close();
outputStream.flush();
outputStream.close();
}
请帮我解决我的错误...... plz
答案 0 :(得分:2)
我正在使用此代码将图片从我的设备上传到服务器
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.v("Test", "IGA");
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
selectedImageUri =(Uri)data.getData();
AddCourtActivity.mImage.setImageURI(selectedImageUri);
selectedImagePath = getPath(selectedImageUri);
imagePath=selectedImagePath;
Log.v("Test","IGA "+imagePath);
} else if (requestCode == CAMERA_PIC_REQUEST) {
Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
selectedImageUri = data.getData();
selectedImagePath = getPath(selectedImageUri);
imagePath=selectedImagePath;
Log.v("Test","IGA1 "+imagePath);
AddCourtActivity.mImage.setImageBitmap(thumbnail);
}
}
if (resultCode == RESULT_CANCELED) {
return;
}
}
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
public String getPath1(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow("userImage"/*MediaStore.Images.Media.DATA*/);
cursor.moveToFirst();
return cursor.getString(column_index);
}
}
//Use this class for upload image to server
public class FileUploader {
private String Tag = "UPLOADER";
private String urlString;// = "YOUR_ONLINE_PHP";
HttpURLConnection conn;
String exsistingFileName;
public String result;
public String uploadImageData(String serverImageTag) {// Server image tag
// may be
// courtImage[] or
// userImage
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
try {
// ------------------ CLIENT REQUEST
Log.e(Tag, "Inside second Method");
FileInputStream fileInputStream = new FileInputStream(new File(
exsistingFileName));
// open a URL connection to the Servlet
URL url = new URL(urlString);
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
conn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
if (serverImageTag.equalsIgnoreCase("courtImage")) {
dos.writeBytes("Content-Disposition: post-data; name=courtImage[];filename="
+ exsistingFileName + "" + lineEnd);
} else if (serverImageTag.equalsIgnoreCase("userImage")) {
dos.writeBytes("Content-Disposition: post-data; name=userImage[];filename="
+ exsistingFileName + "" + lineEnd);
}
dos.writeBytes(lineEnd);
Log.e(Tag, "Headers are written");
// create a buffer of maximum size
int bytesAvailable = fileInputStream.available();
int maxBufferSize = 1000;
// int bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bytesAvailable];
// read file and write it into form...
int bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);
while (bytesRead > 0) {
dos.write(buffer, 0, bytesAvailable);
bytesAvailable = fileInputStream.available();
bytesAvailable = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);
}
// send multipart form data necessary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
String serverResponseMessage = conn.getResponseMessage();
BufferedReader rd = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
// String serverResponseCode = conn.
// String serverResponseMessage = conn.getResponseMessage();
while ((result = rd.readLine()) != null) {
Log.v("result", "result " + result);
Login.fbResponse = result;
}
// close streams
Log.e(Tag, "File is written");
fileInputStream.close();
dos.flush();
dos.close();
rd.close();
} catch (MalformedURLException ex) {
Log.e(Tag, "error: " + ex.getMessage(), ex);
}
catch (IOException ioe) {
Log.e(Tag, "error: " + ioe.getMessage(), ioe);
}
// Parsing has finished.
return result;
}
public FileUploader(String existingFileName, String urlString) {
this.exsistingFileName = existingFileName;
this.urlString = urlString;
}
只需在构造函数中传递existingFileName,urlString,然后上传文件。
}