我正在努力学习android,我现在很好,不是很好。试图扩展我的技能组合。
所以我试图通过改造将视频上传到服务器。我的改造工作上传EditText等。我在这里使用相同的IP地址。 在代码中相机工作精细录制视频并重命名视频,我相信选择视频工作正常(不完全确定,但画廊打开我选择一个视频,它不会崩溃所以......,PHP允许我使用post man发布视频。但是当我点击上传按钮崩溃时。我不确定问题是在获取真实路径,在改装代码中,还是我的文件选择不起作用?我需要一个更好的程序员可以帮我解决这个问题。我一直在寻找过多的问题。尝试了多个例子。只是没有让它发挥作用。我无法弄清楚错误。我试图在那里扔一些吐司,看看我是否得到了一个错误,但我没有得到祝酒。只是一个崩溃。这是我的代码。我至少在尝试,给我一个骨头。
Slim / PHP索引
$app->post('/saveFile', function(Request $request, Response $response){
$response = array();
if (isset($_POST['desc']) && ($_POST['ID']) && strlen($_POST['desc']) > 0 &&
$_FILES['image']['error'] === UPLOAD_ERR_OK) {
$upload = new uploads();
$file = $_FILES['image']['tmp_name'];
$desc = $_POST['desc'];
$ID = $_POST['ID'];
if ($upload->saveFile($ID, $file,
getFileExtension($_FILES['image']['name']), $desc)) {
$response['error'] = false;
$response['message'] = 'File Uploaded Successfullly';
}
else {
$response['error'] = true;
$response['message'] = 'Required parameters are not available';
}
echo json_encode($response);
}
});
function getFileExtension($file)
{
$path_parts = pathinfo($file);
return $path_parts['extension'];
}
uploads.php
class uploads
{
private $con;
public function __construct()
{
require_once dirname(__FILE__) . '/DbConnect.php';
$db = new DbConnect();
$this->con = $db->connect();
}
public function saveFile($ID, $file, $extension, $desc)
{
$name = round(microtime(true) * 1000) . '.' . $extension;
$filedest = dirname(__FILE__) . UPLOAD_PATH . $name;
move_uploaded_file($file, $filedest);
$url = $server_ip = gethostbyname(gethostname());
$stmt = $this->con->prepare("INSERT INTO images (ID, description, url)
VALUES (?, ?, ?)");
$stmt->bind_param("sss", $ID, $desc, $name);
if ($stmt->execute())
return true;
else
return false;
}
}
API接口
@Multipart
@POST("saveFile")
Call<MyResponse> uploadImage(@Part MultipartBody.Part file, @Part("desc")
RequestBody desc, @Field("ID") String ID);
我的活动课
public class vidcam extends Activity implements View.OnClickListener {
String ID, prepend;
private final int VIDEO_REQUEST_CODE = 100;
private final int REQUEST_TAKE_GALLERY_VIDEO =22;
File video_file;
Button RecordButton, tobaitana, viduploadbutton, uploadvideo;
Uri selectedVideo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vidcam);
RecordButton = (Button) findViewById(R.id.RecordButton);
RecordButton.setOnClickListener(this);
tobaitana = (Button) findViewById(R.id.tobaitana);
tobaitana.setOnClickListener(this);
viduploadbutton = (Button) findViewById(R.id.viduploadbutton);
viduploadbutton.setOnClickListener(this);
uploadvideo = (Button) findViewById(R.id.uploadvideo);
uploadvideo.setOnClickListener(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
if (requestCode == VIDEO_REQUEST_CODE){
Toast.makeText(getApplicationContext(), "Video Saved",
Toast.LENGTH_LONG).show();
}
if (resultCode == RESULT_OK) {
if(requestCode == REQUEST_TAKE_GALLERY_VIDEO){
selectedVideo = data.getData();
}}}
public File getfilepath () throws IOException {
File videofolder = new File("sdcard/video_app");
if (!videofolder.exists())
{
videofolder.mkdir();
}
String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
prepend = "MOBILITY_" + timestamp + "_";
video_file = File.createTempFile(prepend, ".mp4", videofolder);
return video_file;
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.RecordButton:
Intent video_intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
File videolocation = null;
try {
videolocation = getfilepath();
} catch (IOException e) {
e.printStackTrace();
}
Uri video_uri = Uri.fromFile(videolocation);
video_intent.putExtra(MediaStore.EXTRA_OUTPUT, video_uri);
video_intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(video_intent, VIDEO_REQUEST_CODE);
break;
case R.id.tobaitana:
Intent toanbait = new Intent(this, Abait.class);
startActivity(toanbait);
break;
case R.id.viduploadbutton:
Intent selectfile = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(selectfile, REQUEST_TAKE_GALLERY_VIDEO);
break;
case R.id.uploadvideo:
uploadFile(selectedVideo);
break;
}
}
public void useID() {
SharedPreferences shareID = getSharedPreferences("shareID", Context.MODE_PRIVATE);
ID = shareID.getString("ID", "");
}
private String getRealPathFromURI(Uri contentUri) {
String filePath;
Cursor cursor = getContentResolver().query(contentUri, null, null, null, null);
if(cursor == null)
{
filePath = contentUri.getPath();
}else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATA);
filePath = cursor.getString(idx);
cursor.close();
Toast.makeText(getApplicationContext(), "realpath toast" + filePath, Toast.LENGTH_LONG).show();
}
return filePath;
}
private void uploadFile(Uri selectedVideo) {
useID();
File vidfile = new File(getRealPathFromURI(selectedVideo));
if (vidfile.exists()) {
RequestBody requestBody = RequestBody.create(MediaType.parse(getContentResolver().getType(selectedVideo)), vidfile);
MultipartBody.Part file = MultipartBody.Part.createFormData("filename", vidfile.getName(), requestBody);
RequestBody desc = RequestBody.create(MediaType.parse("text/plain"), vidfile.getName());
Call<MyResponse> call = RetrofitClient.getInstance().getAPIService().uploadImage(file, desc, ID);
call.enqueue(new Callback<MyResponse>() {
@Override
public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
if (!response.body().error) {
Toast.makeText(getApplicationContext(), "File Uploaded Successfully...", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "Some error occurred...", Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<MyResponse> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});
} else {Toast.makeText(getApplicationContext(), "no file exists...", Toast.LENGTH_LONG).show();
}
}
}
你的控制器方法都错了,你必须使用Request / Response对象而不是返回修改后的Response;我的版本更接近预期用途,但它并不完美,主要是因为我没有Android工具。
我希望它有所帮助,更多信息在这里:Request UploadedFiles HttpStatusCodes
$app->post('/saveFile', function(\Slim\Http\Request $request, \Slim\Http\Response $response){
$responseData = [];
$responseCode = 400;
/** @var \Psr\Http\Message\UploadedFileInterface[] $files */
$files = $request->getUploadedFiles();
/** @var string[] $postData */
$postData = $request->getParsedBody();
if ( !empty($postData['desc']) && ($postData['ID']) && !empty($files)) {
$upload = new uploads();
// use this if you are only upload one file
// otherwise loop though them all
$file = reset($files);
$desc = $postData['desc'];
$ID = $postData['ID'];
// this means the file was uploaded ok
if ( $file->getError() === UPLOAD_ERR_OK ) {
if ( $upload->saveFile($ID, $file, $file->getClientMediaType(), $desc) ) {
$responseData['error'] = false;
$responseData['message'] = 'File Uploaded Successfully';
$responseCode = 200;
}
else {
$responseData['error'] = true;
$responseData['message'] = 'Required parameters are not available';
$responseCode = 406;
}
}
else {
$responseData['error'] = true;
$responseData['message'] = 'File upload error: '. $file->getError();
$responseCode = 409;
}
}
return $response->withJson($responseData, $responseCode);
});
上传编辑
class uploads
{
private $con;
public function __construct()
{
// you shouldn't need this if you are using Slim
// and you are doing require_once '/vendor/autoload.php' at the beginning of your
// index.php
require_once dirname(__FILE__) . '/DbConnect.php';
$db = new DbConnect();
$this->con = $db->connect();
}
public function saveFile($ID, \Psr\Http\Message\UploadedFileInterface $file, $extension, $desc)
{
$name = round(microtime(true) * 1000) . '.' . $extension;
$filedest = dirname(__FILE__) . UPLOAD_PATH . $name;
$file->moveTo($filedest);
$url = $server_ip = gethostbyname(gethostname());
$stmt = $this->con->prepare("INSERT INTO images (ID, description, url) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $ID, $desc, $name);
return $stmt->execute();
}
}