如何解决Android 使用 volley 将 pdf 文档上传到服务器
我正在按照教程使用 this site
将 pdf 文档从 android 上传到服务器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 举报,一经查实,本站将立刻删除。