Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:使用Apache服务器将图像上载到Web服务器时出现问题_Java_Android_Web Services_Tomcat_Upload - Fatal编程技术网

Java Android:使用Apache服务器将图像上载到Web服务器时出现问题

Java Android:使用Apache服务器将图像上载到Web服务器时出现问题,java,android,web-services,tomcat,upload,Java,Android,Web Services,Tomcat,Upload,我是Android和Web服务方面的新手,尤其是在这些方面,我正在尝试使用Web服务创建一个Web服务,以便存储从Android应用程序发送的图像。然而,我有一个问题上传到服务器的形象,这并没有显示。应该存放在哪里?另一个问题是,即使我创建了一个Web服务,它也只显示HelloWorld,即最初在NetBeans中创建的服务。 以下是logcat日志: 04-01 00:03:55.831: E/SpannableStringBuilder(4384): SPAN_EXCLUSIVE_EXCLU

我是Android和Web服务方面的新手,尤其是在这些方面,我正在尝试使用Web服务创建一个Web服务,以便存储从Android应用程序发送的图像。然而,我有一个问题上传到服务器的形象,这并没有显示。应该存放在哪里?另一个问题是,即使我创建了一个Web服务,它也只显示HelloWorld,即最初在NetBeans中创建的服务。 以下是logcat日志:

04-01 00:03:55.831: E/SpannableStringBuilder(4384): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-01 00:03:55.831: E/SpannableStringBuilder(4384): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
04-01 00:04:55.792: W/IInputConnectionWrapper(4384): getSelectedText on inactive InputConnection
04-01 00:04:55.792: W/IInputConnectionWrapper(4384): setComposingText on inactive InputConnection
04-01 00:05:45.074: I/System.out(4555): Not a DRM File, opening notmally
04-01 00:05:45.074: I/System.out(4555): buffer returned 
04-01 00:05:45.089: D/dalvikvm(4555): GC_FOR_ALLOC freed 79K, 9% free 7518K/8195K, paused 17ms, total 17ms
04-01 00:05:45.097: I/dalvikvm-heap(4555): Grow heap (frag case) to 12.278MB for 4579316-byte allocation
04-01 00:05:45.113: D/dalvikvm(4555): GC_CONCURRENT freed 1K, 6% free 11988K/12679K, paused 2ms+2ms, total 18ms
04-01 00:05:45.285: D/libEGL(4555): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
04-01 00:05:45.285: D/libEGL(4555): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
04-01 00:05:45.292: D/libEGL(4555): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
04-01 00:05:45.371: D/OpenGLRenderer(4555): Enabling debug mode 0
04-01 00:05:45.691: I/System.out(4555): Status is HTTP/1.1 200 OK
04-01 00:05:45.691: I/System.out(4555): Response: <!DOCTYPE html><html>    <head>        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">        <title>JSP Page</title>    </head>    <body>        <h1>Hello World!</h1>    </body></html>
最后,这里是Android应用程序的代码,它从SD卡获取图像并将其发送到服务器

public class MainActivity extends Activity{
    Bitmap bm;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    try {
        bm = BitmapFactory.decodeFile("/sdcard/DCIM/FinalM8.JPG");
        if(bm==null)
            throw new Exception("no picture!");
        new MyAsyncTask().execute();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
private class MyAsyncTask extends AsyncTask<Void, Void, Void>{
protected Void doInBackground(Void... arg0) {
    // TODO Auto-generated method stub
    try {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bm.compress(CompressFormat.JPEG, 50, bos);
        byte[] data = bos.toByteArray();
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost postRequest = 
            new HttpPost("http://192.168.1.35:8080/WebApplication4");
        ByteArrayBody bab = new ByteArrayBody(data, "FinalM8.JPG");
        MultipartEntity reqEntity = new MultipartEntity(
                HttpMultipartMode.BROWSER_COMPATIBLE);
        reqEntity.addPart("image", bab);
        postRequest.setEntity(reqEntity);
        HttpResponse response = httpClient.execute(postRequest);
        System.out.println("Status is "+response.getStatusLine());
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                response.getEntity().getContent(), "UTF-8"));
        String sResponse;
        StringBuilder s = new StringBuilder();
        while ((sResponse = reader.readLine()) != null) {
            s = s.append(sResponse);
        }
        System.out.println("Response: " + s);
    } catch (Exception e) {
        // handle exception here
        e.printStackTrace();
    }
    return null;
}
}
}
公共类MainActivity扩展活动{
位图bm;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
试一试{
bm=BitmapFactory.decodeFile(“/sdcard/DCIM/FinalM8.JPG”);
如果(bm==null)
抛出新异常(“无图片!”);
新建MyAsyncTask().execute();
}捕获(例外e){
e、 printStackTrace();
}
}
私有类MyAsyncTask扩展了AsyncTask{
受保护的Void doInBackground(Void…arg0){
//TODO自动生成的方法存根
试一试{
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
压缩(CompressFormat.JPEG,50,bos);
字节[]数据=bos.toByteArray();
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost postRequest=
新的HttpPost(“http://192.168.1.35:8080/WebApplication4");
ByteArrayBody bab=新的ByteArrayBody(数据,“FinalM8.JPG”);
多方实体REQUENTITY=新多方实体(
HttpMultipartMode.BROWSER_兼容);
请求实体添加部分(“图像”,bab);
postRequest.setEntity(reqEntity);
HttpResponse response=httpClient.execute(postRequest);
System.out.println(“状态为”+response.getStatusLine());
BufferedReader reader=新的BufferedReader(新的InputStreamReader(
response.getEntity().getContent(),“UTF-8”);
字符串响应;
StringBuilder s=新的StringBuilder();
而((sResponse=reader.readLine())!=null){
s=s.append(sResponse);
}
System.out.println(“响应:+s”);
}捕获(例外e){
//在这里处理异常
e、 printStackTrace();
}
返回null;
}
}
}
我会很感激你的帮助,因为我对网络服务还很陌生,如果你认为代码对你有用的话,可以随意使用


感谢您抽出时间

首先,我在Android端没有看到任何
OutOfMemoryError
,但这不是您上传文件的方式

您正试图从SD卡读取该文件,并将其解压缩为
位图
,然后将其重新压缩为.jpg字节数组并上载

这造成了明显的问题:

  • 位图
    对于许多设备来说太大,会导致
    OutOfMemoryError
  • 您发送的图像将与原始图像不同,因为 先解码,然后编码
  • 不要使用硬编码的SD卡路径,请考虑使用:
    Environment.getExternalStorageDirectory()
    您不应该发送
    位图
    ,而应该以
    输入流
    的形式打开文件并发送该文件

    示例

    String url = Environment.getExternalStorageDirectory() + "/DCIM/FinalM8.JPG";
    File f_path = new File(url);
    InputStream fis = new BufferedInputStream(new FileInputStream(f_path));
    int d;
    while ((d = fis.read()) != -1) {
        bos.write(d);
    }
    

    你好,大卫,谢谢你的提示。然而,在这种情况下,这不是问题(目前)。问题仍然是,理论上,设备发送图像,但服务器中没有图像或文件。我在Android设备上解决的问题可能是次要的,只要您确定Android LogCat中没有捕获到可以解释客户端上传失败的
    异常。您是否有可能错过Android上的
    异常
    ?对于任何Android设备来说,能够在SD卡上打开全尺寸图像而无需比例因子或
    OutOfMemoryError
    ,这是不寻常的,特别是如果图像是由相机拍摄的。嗨,David,图像转换为位图的代码部分取自一个理论上可行的教程。正如我所说,我对web服务非常陌生,但我想问题出在web服务部分,因为它给Android设备的响应是消息“Hello World”(最初生成的代码的一部分,但我在NetBeans中删除了该部分)是的。这对我来说是有道理的。如果您确认Android中没有
    异常
    ,请在Web服务正常工作后将此答案作为优化,因为建议是合理的。祝你好运,凯瑟琳!再次感谢David,我在logcat中发布了状态,理论上该设备正在连接到webservice 00:05:45.691:I/System.out(4555):状态为HTTP/1.1200 OK请不要在Android应用程序中使用
    System.out
    。使用预期的
    日志
    String url = Environment.getExternalStorageDirectory() + "/DCIM/FinalM8.JPG";
    File f_path = new File(url);
    InputStream fis = new BufferedInputStream(new FileInputStream(f_path));
    int d;
    while ((d = fis.read()) != -1) {
        bos.write(d);
    }