Я пытаюсь отправить видеофайл с моего устройства Android на сервер (который использует PHP для обработки запроса). Я использовал залп для других запросов, которые я сделал на том же сервере, но когда я пытаюсь отправить видеофайл (как Base64 String) на сервер, я получаю OutOfMemoryError. Мне было интересно, есть ли способ отправить файл по-другому (возможно, используя поток).Отправить большой (видео) файл (ы) с Android на PHP Server
Это мой текущий метод, чтобы отправить видео файл:
private void syncFullVideos() {
checkPermissions();
if (pDialog == null || !pDialog.isShowing()) {
pDialog = new ProgressDialog(this);
pDialog.setCanceledOnTouchOutside(false);
pDialog.setMessage(getString(R.string.pDialogSync));
pDialog.show();
}
syncSucces = new boolean[syncVideos.size()];
Arrays.fill(syncSucces, Boolean.FALSE);
for (final Video video: syncVideos) {
String picturepath = video.getImage_path();
if (fileExists(picturepath)) {
File videoFile = new File(picturepath);
FileInputStream fin = null;
byte[] byte_arr = null;
try {
fin = new FileInputStream(videoFile);
byte_arr = new byte[(int)videoFile.length()];
fin.read(byte_arr);
} catch (IOException e) {
e.printStackTrace();
}
final String image_str = Base64.encodeToString(byte_arr, 0);
Log.d("SyncFullVideos", video.toString());
String tag_string_req = "string_req";
final String TAG = AppController.class
.getSimpleName();
String url = "http://android.diggin.io/diggin/v1/videos";
StringRequest strReq = new StringRequest(Request.Method.PUT,
url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response);
try {
final JSONObject jsonObject = new JSONObject(response);
if (!jsonObject.getBoolean("error4")) {
int index = jsonObject.getInt("index");
syncSucces[index] = true;
Log.e("AddSucces(" + (addCount + 1) + "/" + (syncVideos.size()) + ")", video.toString());
addCount++;
if (addCount == syncVideos.size()) {
refreshPhotos();
}
} else {
Log.e("AddFail(" + (addCount + 1) + "/" + (syncVideos.size()) + ")", video.toString());
addCount++;
if (addCount == syncVideos.size()) {
refreshPhotos();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
//Send message when something goes wrong
runOnUiThread(new Runnable() {
@Override
public void run() {
pDialog.hide();
AlertDialog.Builder dlgAlert = new AlertDialog.Builder(PictureActivity.this);
dlgAlert.setMessage(R.string.errFullSyncVids);
dlgAlert.setPositiveButton(R.string.errBtnOK, null);
dlgAlert.setCancelable(true);
dlgAlert.create().show();
}
});
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<>();
params.put("id", String.valueOf(video.getId()));
params.put("im_path", video.getDBImage_path());
params.put("image", image_str);
params.put("index", String.valueOf(syncVideos.indexOf(video)));
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
}
}
И это PHP я использую, чтобы обработать запрос и отправить ответ (я использую REST API):
$app->put('/videos', function() use ($app) {
// check for required params
verifyRequiredParams(array('id','im_path','image','index'));
$response = array();
$id = $app->request->put('id');
$im_path = $app->request->put('im_path');
$image = $app->request->put('image');
$index = $app->request->put('index');
$db = new DbHandler();
// update photo
$result = $db->updateVideo($id, $im_path);
if ($result) {
$response["error"] = false;
$response["message"] = "Video updated successfully";
// Decode Image
$binary=base64_decode($image);
header('Content-Type: video/mp4');
$im_path2 = explode("_",$im_path);
$im_path2[0] .= 's';
$im_path2[2] = $im_path;
$im_path3 = implode("/",$im_path2);
$filepath = '../images/'.$im_path3;
$dirname = dirname($filepath);
if (!is_dir($dirname))
{
if(mkdir($dirname, 0777, true)) {
$response["error2"] = false;
$response["message2"] = "Directory Created Succesfully";
} else {
$response["error2"] = true;
$response["error3"] = true;
$response["error4"] = true;
$response["message2"] = "Failed to create directory. Please try again";
$response["filepath"] = $filepath;
}
}
// Images will be saved under images folder
$file = fopen($filepath, 'wb');
if ($file == false) {
$response["error3"] = true;
$response["error4"] = true;
$response["message3"] = "Failed to open file. Please try again";
$response["filepath"] = $filepath;
echoRespnse(200, $response);
} else {
// Create File
$response["error3"] = false;
$response["message3"] = "File is open and good to write";
fwrite($file, $binary);
fclose($file);
if (file_exists($filepath)) {
$response["error4"] = false;
$response["message4"] = "File exists";
$response["index"] = $index;
echoRespnse(201, $response);
} else {
$response["error4"] = true;
$response["message4"] = "File doesn't exist";
echoRespnse(200, $response);
}
}
} else {
$response["error"] = true;
$response["error2"] = true;
$response["error3"] = true;
$response["error4"] = true;
$response["message"] = "Failed to update video. Please try again";
$response["id"] = $id;
$response["im_path"] = $im_path;
echoRespnse(200, $response);
}
});
Насколько велик видеофайл? Это может быть размер файла, а не тип, который является проблемой. –
@StuartWhitehouse. Для последнего теста я использовал файл размером около 20 МБ, но другие файлы могут быть больше –