【问题标题】:Uploading multiple image on php server from android从android在php服务器上上传多个图像
【发布时间】:2012-02-14 23:49:10
【问题描述】:

帮助这个特定的服务器端 php 代码我没有任何 php 知识,我必须将三个图像从 android 上传到这个 php 页面。

我尝试了很多方法并进行了搜索,但没有教程或任何内容对我没有帮助,我的 android 代码运行正常。 DNS 也已配置,但图像未显示在服务器端。请帮我写java代码。

PHP:

<?php
if ($_FILES["file1"]["error"] > 0)
{
    header("HTTP/1.1 400 Bad Request");
    echo "Error: " . $_FILES["file1"]["error"] . "<br />";
}
else if ($_FILES["file2"]["error"] > 0)
{
    header("HTTP/1.1 400 Bad Request");
    echo "Error: " . $_FILES["file1"]["error"] . "<br />";
}
else if ($_FILES["file3"]["error"] > 0)
{
    header("HTTP/1.1 400 Bad Request");
    echo "Error: " . $_FILES["file1"]["error"] . "<br />";
}
else
{
    if ($_FILES["file1"]["error"] > 0)
    {
        echo "Error: " . $_FILES["file1"]["error"] . "<br />";
    }
    else
    {
        echo "Upload: " . $_FILES["file1"]["name"] . "<br />";
        echo "Type: " . $_FILES["file1"]["type"] . "<br />";
        echo "Size: " . ($_FILES["file1"]["size"] / 1024) . " Kb<br />";
        echo "Stored in: " . $_FILES["file1"]["tmp_name"]. "<br />";
    }

    //$target_path = "uploads/";
    $target_path = "elp/pendingimages/";

    $target_path = $target_path . basename( $_FILES['file1']['name']); 

    if(move_uploaded_file($_FILES['file1']['tmp_name'], $target_path)) {
        echo "The file ".  basename( $_FILES['file1']['name']). 
            " has been uploaded"; 
    } 
    else{
        echo "There was an error uploading the file, please try again!";
    }

    if ($_FILES["file2"]["error"] > 0)
    {
        echo "Error: " . $_FILES["file2"]["error"] . "<br />";
    }
    else
    {
        echo "Upload: " . $_FILES["file2"]["name"] . "<br />";
        echo "Type: " . $_FILES["file2"]["type"] . "<br />";
        echo "Size: " . ($_FILES["file2"]["size"] / 1024) . " Kb<br />";
        echo "Stored in: " . $_FILES["file2"]["tmp_name"]. "<br />";
    }

    //$target_path = "uploads/";
    $target_path = "elp/pendingimages/";

    $target_path = $target_path . basename( $_FILES['file2']['name']); 

    if(move_uploaded_file($_FILES['file2']['tmp_name'], $target_path)) {
        echo "The file ".  basename( $_FILES['file2']['name']). 
        " has been uploaded";
    } 
    else{
        echo "There was an error uploading the file, please try again!";
    }

    if ($_FILES["file3"]["error"] > 0)
    {
        echo "Error: " . $_FILES["file3"]["error"] . "<br />";
    }
    else
    {
        echo "Upload: " . $_FILES["file3"]["name"] . "<br />";
        echo "Type: " . $_FILES["file3"]["type"] . "<br />";
        echo "Size: " . ($_FILES["file3"]["size"] / 1024) . " Kb<br />";
        echo "Stored in: " . $_FILES["file3"]["tmp_name"]. "<br />";
    }


    //$target_path = "uploads/";
    $target_path = "elp/pendingimages/";

    $target_path = $target_path . basename( $_FILES['file3']['name']);  

    if(move_uploaded_file($_FILES['file3']['tmp_name'], $target_path)) {
        echo "The file ".  basename( $_FILES['file3']['name']). 
            " has been uploaded";
    } 
    else{
        echo "There was an error uploading the file, please try again!";
    }
}

?>

Java:

public class TryprojectActivity extends Activity {
    InputStream is;
    int pic_count = 0;
    Bitmap bitmap=null;
    FileInputStream in1,in2,in3;
    BufferedInputStream buf;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

        try {
            in1 = new FileInputStream("/sdcard/1.jpg");
        } 
        catch (FileNotFoundException e2) {
        // TODO Auto-generated catch block
            e2.printStackTrace();
        }

        try {
            in2 = new FileInputStream("/sdcard/2.jpg");
        } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } 

    try {
        in3 = new FileInputStream("/sdcard/3.jpg");
    } 
    catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } 

    Bitmap bitmapOrg1 = BitmapFactory.decodeStream(in1);
    ByteArrayOutputStream bao1 = new ByteArrayOutputStream();
    bitmapOrg1.compress(Bitmap.CompressFormat.JPEG, 90, bao1);
    byte [] imagearray1 = bao1.toByteArray();
    String ba1=Base64.encode(imagearray1);

    Bitmap bitmapOrg2 = BitmapFactory.decodeStream(in2);
    ByteArrayOutputStream bao2 = new ByteArrayOutputStream();
    bitmapOrg2.compress(Bitmap.CompressFormat.JPEG, 90, bao2);
    byte [] imagearray2 = bao2.toByteArray();
    String ba2=Base64.encode(imagearray2);

    Bitmap bitmapOrg3 = BitmapFactory.decodeStream(in3);
    ByteArrayOutputStream bao3 = new ByteArrayOutputStream();
    bitmapOrg3.compress(Bitmap.CompressFormat.JPEG, 90, bao3);
    byte [] imagearray3 = bao3.toByteArray();
    String ba3=Base64.encode(imagearray3);

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);

    nameValuePairs.add(new BasicNameValuePair("image1",ba1));
    nameValuePairs.add(new BasicNameValuePair("image2",ba2));
    nameValuePairs.add(new BasicNameValuePair("image3",ba3));

    try{
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://helpdesk.cispl.com/upload_file.php");
        UrlEncodedFormEntity obj = new UrlEncodedFormEntity(nameValuePairs);
        obj.setChunked(true);
        httppost.setEntity(obj);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        //is = entity.getContent();
        httpclient.getConnectionManager().shutdown(); 
    }
    catch(Exception e){
        //CommonFunctions.writeLOG(ctx.getClass().toString(), e.toString());
        //CommonFunctions.showToast(ctx, "Unable to post captured image file: " +
        //e.toString());
    }
}

【问题讨论】:

  • 那些图片必须通过HTTP上传,你如何上传? (既然你提到了Java)
  • 我的意思是android应用程序中需要的java Activity代码。而且我也厌倦了使用 http 和 mulitpart 上传,但没有用。这可能是因为我试图在不了解 php 的情况下编写代码。
  • @user1160020,php 代码是正确的。所以,不要责怪你的php知识。您的多部分请求中似乎存在错误。
  • 我也尝试过使用 multipart 但目前我正在使用此代码并且代码中没有错误,否则:S
  • @user1160020 你的问题解决了吗?你能告诉我解决方案吗?你的代码看起来和我的一模一样。

标签: php android image file-upload


【解决方案1】:

看起来你的 PHP 是正确的。

在您的设备上使用带有 MultipartEntity 数据类型的 HTTP POST 请求。阅读更多here

编辑

来自我的链接的示例:

您必须下载其他库才能让MultipartEntity 运行!

1) 从http://james.apache.org/download.cgi#Apache_Mime4J 下载 httpcomponents-client-4.1.zip 并将 apache-mime4j-0.6.1.jar 添加到您的项目中。

2) 从http://hc.apache.org/downloads.cgi 下载 httpcomponents-client-4.1-bin.zip 并将 httpclient-4.1.jar、httpcore-4.1.jar 和 httpmime-4.1.jar 添加到您的项目中。

3) 使用下面的示例代码。

private DefaultHttpClient mHttpClient; public ServerCommunication() { HttpParams params = new BasicHttpParams(); params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); mHttpClient = new DefaultHttpClient(params); } public void uploadUserPhoto(File image1, File image2, File image3) { try { HttpPost httppost = new HttpPost("some url"); MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); multipartEntity.addPart("Title", new StringBody("Title")); multipartEntity.addPart("Nick", new StringBody("Nick")); multipartEntity.addPart("Email", new StringBody("Email")); multipartEntity.addPart("Description", new StringBody(Settings.SHARE.TEXT)); multipartEntity.addPart("file1", new FileBody(image1)); multipartEntity.addPart("file2", new FileBody(image2)); multipartEntity.addPart("file3", new FileBody(image3)); httppost.setEntity(multipartEntity); mHttpClient.execute(httppost, new PhotoUploadResponseHandler()); } catch (Exception e) { Log.e(ServerCommunication.class.getName(), e.getLocalizedMessage(), e); } } private class PhotoUploadResponseHandler implements ResponseHandler { @Override public Object handleResponse(HttpResponse response) throws ClientProtocolException, IOException { HttpEntity r_entity = response.getEntity(); String responseString = EntityUtils.toString(r_entity); Log.d("UPLOAD", responseString); return null; } }

【讨论】:

  • 我将所有三个图像转换为 byteArray,然后将其添加到列表中。之后我该怎么办???还是我走错路了?
  • in1 = new FileInputStream("/sdcard/1.jpg");位图 bitmapOrg1 = BitmapFactory.decodeStream(in1); ByteArrayOutputStream bao1 = new ByteArrayOutputStream(); bitmapOrg1.compress(Bitmap.CompressFormat.JPEG, 90, bao1); byte [] imagearray1 = bao1.toByteArray();字符串 ba1=Base64.encode(imagearray1);这是我正在为所有三个图像做的
  • 看我的例子。使用这种方法,MultipartEntity 将为您做所有事情。您只需要从您的文件创建 FileBody(并从您的图像创建文件)。
  • reqEntity.addpart();此命令配置路径出错...即使我已经给出了 apache 和 http jar 路径
  • org.apache.james.mime4j.message.SingleBody 类型无法解析。它是从所需的 .class 文件中间接引用的
【解决方案2】:

首先,您的代码可以优化为以下内容:

$files = array('file1', 'file2', 'file3');
$path = 'elp/pendingimages/';

foreach ($files as $file) {
    if ($_FILES[$file]['error'] > 0) {
        echo 'Error: '. $_FILES[$file]['error'] .'<br />';
    }
    else {
        echo 'Upload: '. $_FILES[$file]['name'] .'<br />';
        echo 'Type: '. $_FILES[$file]['type'] .'<br />';
        echo 'Size: '. ($_FILES[$file]['size'] / 1024) .' Kb<br />';
        echo 'Stored in: '. $_FILES[$file]['tmp_name'] .'<br />';
    }

    $basename = basename($_FILES[$file]['name']);

    if (move_uploaded_file($_FILES[$file]['tmp_name'], $path . $basename) {
        echo "The file {$basename} has been uploaded";
    }
    else {
        echo 'There was an error uploading the file, please try again!';
    }
}

如果您为每个文件使用不同的字段,那很好。

接下来你可以看到 $_FILES 数组在多次上传时自身存储的内容:

$_FILES = array(
    ['files'] => array(
        ['name'] => array(
            [0] => 'WALL_video.jpg'
            [1] => 'WALLc.jpg'
        )
        ['type'] => array(
            [0] => 'image/jpeg'
            [1] => 'image/jpeg'
        )
        ['tmp_name'] => array(
            [0] => '/tmp/phpnbKcdM'
            [1] => '/tmp/phpnrHSN1'
        )
        ['error'] => array(
            [0] => 0
            [1] => 0
        )
        ['size'] => array(
            [0] => 885968
            [1] => 839713
        )
    )
)

如果您使用名称为 files[] 的一个字段作为文件数组,则以下代码将适用于您。

$target_path = 'elp/pendingimages/';

foreach ($_FILES['files']['name'] as $index => $name) {
    if ($_FILES['files']['error'][$index] > 0) {
        echo 'Error: ' . $_FILES['files']['error'][$index] . '<br />';
    }
    else {
        echo 'Upload: '. $_FILES['files']['name'][$index] .'<br />';
        echo 'Type: '. $_FILES['files']['type'][$index] .'<br />';
        echo 'Size: '. ($_FILES['files']['size'][$index] / 1024) .' Kb<br />';
        echo 'Stored in: '. $_FILES['files']['tmp_name'][$index] .'<br />';
    }

    $path = $target_path . basename($name);

    if (move_uploaded_file($_FILES['files']['tmp_name'][$index], $path) {
        echo "The file {$name} has been uploaded";
    }
    else {
        echo 'There was an error uploading the file, please try again!';
    }
}

【讨论】:

    【解决方案3】:

    查看我关于向服务器发送多张图片的帖子 Click here

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 2011-02-02
      • 2015-03-29
      • 2011-10-15
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      相关资源
      最近更新 更多