上传到服务器后清空图像文件

时间:2014-02-19 08:21:38

标签: java php android laravel

我正在尝试将图片上传到服务器。

以下是我在Android中编写的代码,用于将图像文件和其他一些参数一起发送到服务器:

static String imagePath = "/storage/sdcard0/Pictures/image.jpg";
static String url = "http://example.com/api";
static String user_id = "99401";

public static void executeMultipartPost() throws IOException, ClientProtocolException {

    HttpClient httpclient = new DefaultHttpClient();
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

    HttpPost httppost = new HttpPost(url);
    File file = new File(imagePath);
    FileBody fb = new FileBody(file);

    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

    builder.addPart("user_id", new StringBody(user_id));
    builder.addPart("type", new StringBody("single"));
    builder.addPart("userfile", fb);
    final HttpEntity entity = builder.build();


    httppost.setEntity(entity);

    Log.i(TAG, "Executing request: " + httppost.getRequestLine());

    HttpResponse response = httpclient.execute(httppost);
    HttpEntity resEntity = response.getEntity();
    Log.i(TAG, ""+response.getStatusLine());
    if (resEntity != null) {
        Log.i(TAG, EntityUtils.toString(resEntity));
    }
    if (resEntity != null) {
        resEntity.consumeContent();
    }
    httpclient.getConnectionManager().shutdown();
}

一切正常,除非上传到服务器,服务器会收到图片。我只能看到一个0字节的图像文件。我猜客户端代码中的某些内容未正确设置。

执行代码后我在Logcat中得到的响应是这样的(来自 Laravel 错误日志):

<html><h2>Unhandled Exception</h2>
    <h3>Message:</h3>
    <pre>copy(): The first argument to copy() function cannot be a directory</pre>
    <h3>Location:</h3>
    <pre>/home/ked.ai/www/laravel/file.php on line 92</pre>
    <h3>Stack Trace:</h3>
    <pre>#0 /home/ked.ai/www/laravel/laravel.php(42): Laravel\Error::native(2, 'copy(): The fir...', '/home/ked.ai/ww...', 92)
    #1 [internal function]: Laravel\{closure}(2, 'copy(): The fir...', '/home/ked.ai/ww...', 92, Array)
    #2 /home/ked.ai/www/laravel/file.php(92): copy('/', '/home/ked.ai/ww...')
    #3 /home/ked.ai/www/application/controllers/api2/item.php(190): Laravel\File::copy('/', '/home/ked.ai/ww...')
    #4 [internal function]: Api2_Item_Controller->post_new()
    #5 /home/ked.ai/www/laravel/routing/controller.php(325): call_user_func_array(Array, Array)
    #6 /home/ked.ai/www/laravel/routing/controller.php(285): Laravel\Routing\Controller->response('new', Array)
    #7 /home/ked.ai/www/laravel/routing/controller.php(165): Laravel\Routing\Controller->execute('new', Array)
    #8 /home/ked.ai/www/laravel/routing/route.php(153): Laravel\Routing\Controller::call('api2.item@new', Array)
    #9 /home/ked.ai/www/laravel/routing/route.php(124): Laravel\Routing\Route->response()
    #10 /home/ked.ai/www/laravel/laravel.php(167): Laravel\Routing\Route->call()
    #11 /home/ked.ai/www/public/index.php(34): require('/home/ked.ai/ww...')
    #12 {main}</pre></html>

它似乎传递了目录而不是文件。任何解决方法?

3 个答案:

答案 0 :(得分:0)

您可以使用此方法将图像传递给php服务器。

  1. 使用Base64.encodeBytes(byte_data)将图像转换为base64字符串。
  2. 在服务器端,php代码通过base64_decode(str)将base64字符串转换为图像。

答案 1 :(得分:0)

其工作代码:

public void executeMultipartPost() throws Exception {

        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            bm.compress(CompressFormat.JPEG, 75, bos);
            byte[] data = bos.toByteArray();
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost postRequest = new HttpPost(url_path);
            ByteArrayBody bab = new ByteArrayBody(data, "forest.jpg");
            // File file= new File("/mnt/sdcard/forest.png");
            // FileBody bin = new FileBody(file);
            MultipartEntity reqEntity = new MultipartEntity(
                    HttpMultipartMode.BROWSER_COMPATIBLE);

            reqEntity.addPart("file", bab);
            reqEntity.addPart("category ", new StringBody("1"));
            reqEntity.addPart("user_id ", new StringBody("55"));

            postRequest.setEntity(reqEntity);

            HttpResponse response = httpClient.execute(postRequest);

            String my_response = convertStreamToString(response.getEntity()
                    .getContent());
            Toast.makeText(getApplicationContext(), my_response,
                    Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

public static String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }

试试吧。

答案 2 :(得分:0)

我设法找到了解决方案。

我只需要改变这一行

builder.addPart("userfile", fb);

builder.addPart("userfile[]", fb);

因为在服务器端,$_FILES['userfile']接收数组类型。

谢谢。