使用 php 上传 AWS EC2 文件
AWS EC2 file upload with php
我在将图像上传到位于 aws ec2 实例中的 wamp 服务器时遇到了一些问题,当我尝试将一些参数上传到我的表中时,除了图像本身之外,所有参数都已成功上传,wamp 服务器安装在Microsoft Windows Server 2012 R2 Base,amazon提供,80端口开放,httpd.conf文件权限
这是来自 android 的代码,它上传图像和参数:
public void uploadProduct() {
//getting name for the image
String name = editText.getText().toString().trim();
String Description = editText2.getText().toString().trim();
String Serial = editText3.getText().toString().trim();
String price = editText4.getText().toString().trim();
//getting the actual path of the image
String path = getPath(fileUri);
//Uploading code
try {
String uploadId = UUID.randomUUID().toString();
//Creating a multi part request
new MultipartUploadRequest(this, uploadId, URL_INDEX)
.addFileToUpload(path, "image") //Adding file
.addParameter("name", name)
.addParameter("product_description", Description)
.addParameter("product_serial", Serial)
.addParameter("product_price", price)//Adding text parameter to the request
.setNotificationConfig(new UploadNotificationConfig())
.setMaxRetries(2)
.startUpload(); //Starting the upload
} catch (Exception exc) {
Toast.makeText(this, exc.getMessage(), Toast.LENGTH_SHORT).show();
}
}
获取图片Uri的代码:
public String getPath(Uri uri) {
String filePath = "";
String wholeID = DocumentsContract.getDocumentId(uri);
// Split at colon, use second item in the array
String id = wholeID.split(":")[1];
String[] column = { MediaStore.Images.Media.DATA };
// where id is equal to
String sel = MediaStore.Images.Media._ID + "=?";
Cursor cursor = getApplicationContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
column, sel, new String[]{ id }, null);
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
return filePath;
}
和 php:
require_once 'db_config.php';
$upload_path = 'uploads/';
$upload_url = 'http://55.26.0.105/android/uploads/';
$response = array();
if($_SERVER['REQUEST_METHOD']=='POST'){
//checking the required parameters from the request
if( isset($_FILES['image']['name']) and isset($_POST['name']) and isset($_POST['product_description']) and isset($_POST['product_serial']) and isset($_POST['product_price'])){
//connecting to the database
$con = mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME) or die('Unable to Connect...');
//getting values from the request
$product_serial_num = (int) $_POST['product_serial'];
$product_price = (int) $_POST['product_price'];
$product_title = $_POST['name'];
$product_description = $_POST['product_description'];
//getting img info from the request
$fileInfo = pathinfo($_FILES['image']['name']);
//getting the file extension
$extension = $fileInfo['extension'];
//file url to store in the database
$file_url = $upload_url . $product_title . '.' . $extension;
//file path to upload in the server
$file_path = $upload_path . $product_title . '.'. $extension;
//trying to save the file in the directory
try{
//saving the file
move_uploaded_file($_FILES['image']['tmp_name'],$file_path);
$sql = "INSERT INTO product_tbl(product_serial_num, product_price, product_title, product_description, product_img) VALUES ('$product_serial_num','$product_price','$product_title','$product_description', '$file_url');";
//adding the path and name to database
if(mysqli_query($con,$sql)){
//filling response array with values
$response['error'] = false;
$response['url'] = $file_url;
$response['name'] = $product_title;
}
//if some error occurred
}catch(Exception $e){
$response['error']=true;
$response['message']=$e->getMessage();
}
//displaying the response
echo json_encode($response);
//closing the connection
mysqli_close($con);
}else{
$response['error']=true;
$response['message']='Please choose a file';
}
}
?>
如有帮助,将不胜感激!
可能的原因:
- 保存上传文件的 PHP 脚本位于其他没有 'uploads' 目录的位置。
- 'uploads' 目录没有适当的访问权限(在 Windows 服务器中不太可能)。
解决方案:
- 尝试使用静态路径作为上传位置。查看您的代码,您最好在 'db_config.php' 文件本身中定义路径。
- 通过转到 'uploads' 目录的属性设置适当的访问权限。
并且要确认文件是否上传成功,您应该将 move_uploaded_file($_FILES['image']['tmp_name'],$file_path);
包装在 if()
条件中。
因为 PHP move_uploaded_file() 函数 returns true
如果文件上传成功,否则 false
否则。
我在将图像上传到位于 aws ec2 实例中的 wamp 服务器时遇到了一些问题,当我尝试将一些参数上传到我的表中时,除了图像本身之外,所有参数都已成功上传,wamp 服务器安装在Microsoft Windows Server 2012 R2 Base,amazon提供,80端口开放,httpd.conf文件权限
这是来自 android 的代码,它上传图像和参数:
public void uploadProduct() {
//getting name for the image
String name = editText.getText().toString().trim();
String Description = editText2.getText().toString().trim();
String Serial = editText3.getText().toString().trim();
String price = editText4.getText().toString().trim();
//getting the actual path of the image
String path = getPath(fileUri);
//Uploading code
try {
String uploadId = UUID.randomUUID().toString();
//Creating a multi part request
new MultipartUploadRequest(this, uploadId, URL_INDEX)
.addFileToUpload(path, "image") //Adding file
.addParameter("name", name)
.addParameter("product_description", Description)
.addParameter("product_serial", Serial)
.addParameter("product_price", price)//Adding text parameter to the request
.setNotificationConfig(new UploadNotificationConfig())
.setMaxRetries(2)
.startUpload(); //Starting the upload
} catch (Exception exc) {
Toast.makeText(this, exc.getMessage(), Toast.LENGTH_SHORT).show();
}
}
获取图片Uri的代码:
public String getPath(Uri uri) {
String filePath = "";
String wholeID = DocumentsContract.getDocumentId(uri);
// Split at colon, use second item in the array
String id = wholeID.split(":")[1];
String[] column = { MediaStore.Images.Media.DATA };
// where id is equal to
String sel = MediaStore.Images.Media._ID + "=?";
Cursor cursor = getApplicationContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
column, sel, new String[]{ id }, null);
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
return filePath;
}
和 php:
require_once 'db_config.php';
$upload_path = 'uploads/';
$upload_url = 'http://55.26.0.105/android/uploads/';
$response = array();
if($_SERVER['REQUEST_METHOD']=='POST'){
//checking the required parameters from the request
if( isset($_FILES['image']['name']) and isset($_POST['name']) and isset($_POST['product_description']) and isset($_POST['product_serial']) and isset($_POST['product_price'])){
//connecting to the database
$con = mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME) or die('Unable to Connect...');
//getting values from the request
$product_serial_num = (int) $_POST['product_serial'];
$product_price = (int) $_POST['product_price'];
$product_title = $_POST['name'];
$product_description = $_POST['product_description'];
//getting img info from the request
$fileInfo = pathinfo($_FILES['image']['name']);
//getting the file extension
$extension = $fileInfo['extension'];
//file url to store in the database
$file_url = $upload_url . $product_title . '.' . $extension;
//file path to upload in the server
$file_path = $upload_path . $product_title . '.'. $extension;
//trying to save the file in the directory
try{
//saving the file
move_uploaded_file($_FILES['image']['tmp_name'],$file_path);
$sql = "INSERT INTO product_tbl(product_serial_num, product_price, product_title, product_description, product_img) VALUES ('$product_serial_num','$product_price','$product_title','$product_description', '$file_url');";
//adding the path and name to database
if(mysqli_query($con,$sql)){
//filling response array with values
$response['error'] = false;
$response['url'] = $file_url;
$response['name'] = $product_title;
}
//if some error occurred
}catch(Exception $e){
$response['error']=true;
$response['message']=$e->getMessage();
}
//displaying the response
echo json_encode($response);
//closing the connection
mysqli_close($con);
}else{
$response['error']=true;
$response['message']='Please choose a file';
}
} ?>
如有帮助,将不胜感激!
可能的原因:
- 保存上传文件的 PHP 脚本位于其他没有 'uploads' 目录的位置。
- 'uploads' 目录没有适当的访问权限(在 Windows 服务器中不太可能)。
解决方案:
- 尝试使用静态路径作为上传位置。查看您的代码,您最好在 'db_config.php' 文件本身中定义路径。
- 通过转到 'uploads' 目录的属性设置适当的访问权限。
并且要确认文件是否上传成功,您应该将 move_uploaded_file($_FILES['image']['tmp_name'],$file_path);
包装在 if()
条件中。
因为 PHP move_uploaded_file() 函数 returns true
如果文件上传成功,否则 false
否则。