Android 使用 volley 将 pdf 文档上传到服务器

如何解决Android 使用 volley 将 pdf 文档上传到服务器

我正在按照教程使用 this site

将 pdf 文档从 android 上传到服务器

我在我的 PHP 服务器上使用 PHP mvc 控制器方式

我的 PHP 代码是:

if($_SERVER['REQUEST_METHOD']=='POST'){

    
//$_FILES['image']['name']   give original name from parameter where 'image' == parametername eg. city.jpg
//$_FILES['image']['tmp_name']  temporary system generated name
//
    $output_dirkyc = PATH."/public/client_files";
    $RandomNumKyc = time();
            $FileNameKyc = str_replace(' ','-',strtolower($_FILES['file']['name']));
            $FileTypeKyc = $_FILES['file']['type']; //"image/png",image/jpeg etc.
            $FileExtKyc = substr($FileNameKyc,strrpos($FileNameKyc,'.'));
            $FileExtKyc = str_replace('.','',$FileExtKyc);
            $FileNameKyc = preg_replace("/\.[^.\s]{3,4}$/","",$FileNameKyc);
            $NewFileNameKyc = $FileNameKyc.'-'.$RandomNumKyc.'.'.$FileExtKyc;
            $ret[$NewFileNameKyc]= $output_dirkyc.$NewFileNameKyc;
            
    
    $id = '9999';
    
    $fileData = [
                        'file' =>$NewFileNameKyc,'fileType' => $FileTypeKyc,'clientID' => $id,'dateCreated' => '2021-05-11','idnumber' => '75501059'
                    ];
    
   
    
    
    


    
    if(move_uploaded_file($_FILES['file']['tmp_name'],$output_dirkyc."/".$NewFileNameKyc)){
            
            if($this->clientModel->insertFile($fileData)){
            
                $emparray = array("red","green");
            
                echo json_encode(array( "status" => "true","message" => "Successfully file added!","data" => $emparray) );
            
            }else{
                
                echo json_encode(array( "status" => "false","message" => "Failed Insert!") );
            
            }
            
                 
                 
           
            }else{
                echo json_encode(array( "status" => "false","message" => "Failed Upload!") );
            }
        //echo "moved to ".$url;
    }else{
        echo json_encode(array( "status" => "false","message" => "Failed Post!") );
    }


}

我的安卓工作室代码

VolleyMultipartRequest.java

package com.example.filesuploads;


import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolBox.HttpHeaderParser;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

public class VolleyMultipartRequest extends Request<NetworkResponse> {

private final String twoHyphens = "--";
private final String lineEnd = "\r\n";
private final String boundary = "apiclient-" + System.currentTimeMillis();

private Response.Listener<NetworkResponse> mListener;
private Response.ErrorListener mErrorListener;
private Map<String,String> mHeaders;


public VolleyMultipartRequest(int method,String url,Response.Listener<NetworkResponse> listener,Response.ErrorListener errorListener) {
    super(method,url,errorListener);
    this.mListener = listener;
    this.mErrorListener = errorListener;
}

@Override
public Map<String,String> getHeaders() throws AuthFailureError {
    return (mHeaders != null) ? mHeaders : super.getHeaders();
}

@Override
public String getBodyContentType() {
    return "multipart/form-data;boundary=" + boundary;
}

@Override
public byte[] getBody() throws AuthFailureError {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(bos);

    try {
        // populate text payload
        Map<String,String> params = getParams();
        if (params != null && params.size() > 0) {
            textParse(dos,params,getParamsEncoding());
        }

        // populate data byte payload
        Map<String,DataPart> data = getByteData();
        if (data != null && data.size() > 0) {
            dataParse(dos,data);
        }

        // close multipart form data after text and file data
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        return bos.toByteArray();
    } catch (IOException e) {
        e.printstacktrace();
    }
    return null;
}

/**
 * Custom method handle data payload.
 *
 * @return Map data part label with data byte
 * @throws AuthFailureError
 */
protected Map<String,DataPart> getByteData() throws AuthFailureError {
    return null;
}

@Override
protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
    try {
        return Response.success(
                response,HttpHeaderParser.parseCacheHeaders(response));
    } catch (Exception e) {
        return Response.error(new ParseError(e));
    }
}

@Override
protected void deliverResponse(NetworkResponse response) {
    mListener.onResponse(response);
}

@Override
public void deliverError(VolleyError error) {
    mErrorListener.onErrorResponse(error);
}

/**
 * Parse string map into data output stream by key and value.
 *
 * @param dataOutputStream data output stream handle string parsing
 * @param params           string inputs collection
 * @param encoding         encode the inputs,default UTF-8
 * @throws IOException
 */
private void textParse(DataOutputStream dataOutputStream,Map<String,String> params,String encoding) throws IOException {
    try {
        for (Map.Entry<String,String> entry : params.entrySet()) {
            buildTextPart(dataOutputStream,entry.getKey(),entry.getValue());
        }
    } catch (UnsupportedEncodingException uee) {
        throw new RuntimeException("Encoding not supported: " + encoding,uee);
    }
}

/**
 * Parse data into data output stream.
 *
 * @param dataOutputStream data output stream handle file attachment
 * @param data             loop through data
 * @throws IOException
 */
private void dataParse(DataOutputStream dataOutputStream,DataPart> data) throws IOException {
    for (Map.Entry<String,DataPart> entry : data.entrySet()) {
        buildDataPart(dataOutputStream,entry.getValue(),entry.getKey());
    }
}

/**
 * Write string data into header and data output stream.
 *
 * @param dataOutputStream data output stream handle string parsing
 * @param parameterName    name of input
 * @param parameterValue   value of input
 * @throws IOException
 */
private void buildTextPart(DataOutputStream dataOutputStream,String parameterName,String parameterValue) throws IOException {
    dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
    dataOutputStream.writeBytes("Content-disposition: form-data; name=\"" + parameterName + "\"" + lineEnd);
    dataOutputStream.writeBytes(lineEnd);
    dataOutputStream.writeBytes(parameterValue + lineEnd);
}

/**
 * Write data file into header and data output stream.
 *
 * @param dataOutputStream data output stream handle data parsing
 * @param dataFile         data byte as DataPart from collection
 * @param inputName        name of data input
 * @throws IOException
 */
private void buildDataPart(DataOutputStream dataOutputStream,DataPart dataFile,String inputName) throws IOException {
    dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
    dataOutputStream.writeBytes("Content-disposition: form-data; name=\"" +
            inputName + "\"; filename=\"" + dataFile.getFileName() + "\"" + lineEnd);
    if (dataFile.getType() != null && !dataFile.getType().trim().isEmpty()) {
        dataOutputStream.writeBytes("Content-Type: " + dataFile.getType() + lineEnd);
    }
    dataOutputStream.writeBytes(lineEnd);

    ByteArrayInputStream fileInputStream = new ByteArrayInputStream(dataFile.getContent());
    int bytesAvailable = fileInputStream.available();

    int maxBufferSize = 1024 * 1024;
    int bufferSize = Math.min(bytesAvailable,maxBufferSize);
    byte[] buffer = new byte[bufferSize];

    int bytesRead = fileInputStream.read(buffer,bufferSize);

    while (bytesRead > 0) {
        dataOutputStream.write(buffer,bufferSize);
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable,maxBufferSize);
        bytesRead = fileInputStream.read(buffer,bufferSize);
    }

    dataOutputStream.writeBytes(lineEnd);
}

class DataPart {
    private String fileName;
    private byte[] content;
    private String type;

    public DataPart() {
    }

    DataPart(String name,byte[] data) {
        fileName = name;
        content = data;
    }

    String getFileName() {
        return fileName;
    }

    byte[] getContent() {
        return content;
    }

    String getType() {
        return type;
    }

}

}

然后在我的主要活动中这是我的代码

package com.example.filesuploads;

import androidx.appcompat.app.AppCompatActivity;


import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.OpenableColumns;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolBox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

private Button btn;
private TextView tv;
private String upload_URL = "http://192.168.30.18/clients/appUploadDoc";
private RequestQueue rQueue;
private ArrayList<HashMap<String,String>> arraylist;
String url = "https://www.google.com";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btn = findViewById(R.id.btn);
    tv = findViewById(R.id.tv);

    btn.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_GET_CONTENT);
            intent.setType("application/pdf");
            startActivityForResult(intent,1);
        }
    });

    tv.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW,Uri.parse(url));
            startActivity(browserIntent);
        }
    });
}
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
    if (resultCode == RESULT_OK) {
        // Get the Uri of the selected file
        Uri uri = data.getData();
        String uriString = uri.toString();
        File myFile = new File(uriString);
        String path = myFile.getAbsolutePath();
        String displayName = null;

        if (uriString.startsWith("content://")) {
            Cursor cursor = null;
            try {
                cursor = this.getContentResolver().query(uri,null,null);
                if (cursor != null && cursor.movetoFirst()) {
                    displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.disPLAY_NAME));
                    Log.d("nameeeee>>>>  ",displayName);

                    uploadPDF(displayName,uri);
                }
            } finally {
                cursor.close();
            }
        } else if (uriString.startsWith("file://")) {
            displayName = myFile.getName();
            Log.d("nameeeee>>>>  ",displayName);
        }
    }

    super.onActivityResult(requestCode,resultCode,data);

}

private void uploadPDF(final String pdfname,Uri pdffile){

    InputStream iStream = null;
    try {

        iStream = getContentResolver().openInputStream(pdffile);
        final byte[] inputData = getBytes(iStream);

        VolleyMultipartRequest volleyMultipartRequest = new VolleyMultipartRequest(Request.Method.POST,upload_URL,new Response.Listener<NetworkResponse>() {
                    @Override
                    public void onResponse(NetworkResponse response) {
                        Log.d("ressssssoo",new String(response.data));
                        rQueue.getCache().clear();
                        try {
                            JSONObject jsonObject = new JSONObject(new String(response.data));
                            Toast.makeText(getApplicationContext(),jsonObject.getString("message"),Toast.LENGTH_SHORT).show();

                            jsonObject.toString().replace("\\\\","");

                            if (jsonObject.getString("status").equals("true")) {
                                Log.d("come::: >>>  ","yessssss");
                                arraylist = new ArrayList<HashMap<String,String>>();
                                JSONArray dataArray = jsonObject.getJSONArray("data");


                                for (int i = 0; i < dataArray.length(); i++) {
                                    JSONObject dataobj = dataArray.getJSONObject(i);
                                    url = dataobj.optString("pathToFile");
                                    tv.setText(url);
                                }


                            }
                        } catch (JSONException e) {
                            e.printstacktrace();
                        }
                    }
                },new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getApplicationContext(),error.getMessage(),Toast.LENGTH_SHORT).show();
                    }
                }) {

            /*
             * If you want to add more parameters with the image
             * you can do it here
             * here we have only one parameter with the image
             * which is tags
             * */
            @Override
            protected Map<String,String> getParams() throws AuthFailureError {
                Map<String,String> params = new HashMap<>();
                // params.put("tags","ccccc");  add string parameters
                return params;
            }

            /*
             *pass files using below method
             * */
            @Override
            protected Map<String,DataPart> getByteData() {
                Map<String,DataPart> params = new HashMap<>();

                params.put("filename",new DataPart(pdfname,inputData));
                return params;
            }
        };


        volleyMultipartRequest.setRetryPolicy(new DefaultRetryPolicy(
                0,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        rQueue = Volley.newRequestQueue(MainActivity.this);
        rQueue.add(volleyMultipartRequest);



    } catch (FileNotFoundException e) {
        e.printstacktrace();
    } catch (IOException e) {
        e.printstacktrace();
    }


}

public byte[] getBytes(InputStream inputStream) throws IOException {
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];

    int len = 0;
    while ((len = inputStream.read(buffer)) != -1) {
        byteBuffer.write(buffer,len);
    }
    return byteBuffer.toByteArray();
}
}

我收到的回复

"status" => "false","message" => "Failed Upload!"

表示文件根本没有上传。我该如何解决

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?