Загрузка файла больших двоичных объектов — я загружаю файл изображения из локальной системы в контейнер больших двоичных объектов Azure. После загрузки размер файла отображается как 0B без расширения

#php #azure #azure-blob-storage

#php #azure #azure-blob-storage

Вопрос:

Я написал PHP-код для загрузки файлов из веб-приложения Azure (с помощью кнопки загрузки из браузера) в контейнер больших двоичных объектов azure. Я успешно могу загрузить файлы в контейнер больших двоичных объектов, однако после загрузки файл находится в azure blob как 0 байт без какого-либо расширения. Я также не могу просмотреть файл, и отображается следующее сообщение: «Файл «1721405003»может отображаться некорректно, поскольку он содержит нераспознанное расширение».

Ниже приведен мой php-код для загрузки файлов в большой двоичный объект —

 <?php
    error_reporting(0); 
?>
<?php
  require_once "vendor/autoload.php";
  use MicrosoftAzureStorageBlobBlobRestProxy;
  use MicrosoftAzureStorageCommonServiceException;
  use WindowsAzureCommonServicesBuilder;
  
  // If upload button is clicked ... 
  if (isset($_POST['upload'])) {

  //upload to azure blob container
  $connectionString = "conn key"; //Enter deployment key
  $containerName = 'sidblobcontainer';
  $blobClient = BlobRestProxy::createBlobService($connectionString);
  $file_name = $_FILES['myFile']['name'];
  $ext = pathinfo($file_name, PATHINFO_EXTENSION);
  $content = fopen($file_name, "r");
  $blob_name = "myblob".'.'.$ext;

  try {
    //Upload blob
    $blobClient->createBlockBlob($containerName, $blob_name, $content);
    echo "successfull";
    
  } catch (ServiceException $e) {
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message.PHP_EOL;
 }


    //upload to azure mysql database server
    $filename = $_FILES["myFile"]["name"]; 
    $tempname = $_FILES["myFile"]["tmp_name"];     
    $folder = "image/".$filename; 
        
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $db = mysqli_connect("demoserversid.mysql.database.azure.com", 
          "siddarth@demoserversid", "****", "images"); 
  
        // Get all the submitted data from the form 
        $sql = "INSERT INTO demo (siddemo) VALUES ('$filename')"; 
  
        // Execute query 
        mysqli_query($db, $sql); 
          
        // Now let's move the uploaded image into the folder: image 
        if (move_uploaded_file($tempname, $folder))  { 
            $msg = "Image uploaded successfully"; 
        }else{ 
            $msg = "Failed to upload image"; 
      }
  } 
  $result = mysqli_query($db, "SELECT * FROM demo");
?> 
  
<!DOCTYPE html> 
<html> 
<head>
<style> #content{ 
    width: 50%; 
    margin: 20px auto; 
    border: 1px solid #cbcbcb; 
} 
form{ 
    width: 50%; 
    margin: 20px auto; 
} 
form div{ 
    margin-top: 5px; 
} 
#img_div{ 
    width: 80%; 
    padding: 5px; 
    margin: 15px auto; 
    border: 1px solid #cbcbcb; 
} 
#img_div:after{ 
    content: ""; 
    display: block; 
    clear: both; 
} 
img{ 
    float: left; 
    margin: 5px; 
    width: 300px; 
    height: 140px; 
}</style>
<title>Image Upload</title> 
<body>Upload to azure</body>
<link rel="stylesheet" type= "text/css" href ="style.css"/> 
<div id="content"> 
  
  <form method="POST" action="" enctype="multipart/form-data"> 
      <input type="file" name="uploadfile" value=""/> 
        
      <div> 
          <button type="submit" name="upload">UPLOAD</button> 
        </div> 
  </form> 
</div> 
</body> 
</html>
 

Вот сообщение, которое я вижу в контейнере больших двоичных объектов

Комментарии:

1. Я использовал функцию path info в PHP. $ext = pathinfo($path, PATHINFO_EXTENSION); Но все же файл, который я загружаю в azure, отображается без какого-либо расширения. Я не уверен, нужно ли мне что-то настраивать в хранилище больших двоичных объектов Azure

Ответ №1:

Я удалил часть, связанную с mysql, и приведенный ниже код работает для меня:

 <?php
    error_reporting(0); 
?>
<?php
  require_once "vendor/autoload.php";
  use MicrosoftAzureStorageBlobBlobRestProxy;
  use MicrosoftAzureStorageCommonServiceException;
  use WindowsAzureCommonServicesBuilder;
  
  // If upload button is clicked ... 
  if (isset($_POST['upload'])) {
      
 
  $connectionString = "<conn str>"; //Enter deployment key
  $containerName = '<container name>';
  $blobClient = BlobRestProxy::createBlobService($connectionString);

  $file_name = $_FILES['fileToUpload']['name'];
  error_log($file_name);
  $ext = pathinfo($file_name, PATHINFO_EXTENSION);
  $content = fopen($_FILES['fileToUpload']["tmp_name"], "r");
  $blob_name = "myblob".'.'.$ext;

  try {
    //Upload blob
    $blobClient->createBlockBlob($containerName, $blob_name, $content);
    echo "successfull";
    
  } catch (ServiceException $e) {
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message.PHP_EOL;
 }
} 

?> 


<!DOCTYPE html> 
<html> 
<head>
<style> #content{ 
    width: 50%; 
    margin: 20px auto; 
    border: 1px solid #cbcbcb; 
} 
form{ 
    width: 50%; 
    margin: 20px auto; 
} 
form div{ 
    margin-top: 5px; 
} 
#img_div{ 
    width: 80%; 
    padding: 5px; 
    margin: 15px auto; 
    border: 1px solid #cbcbcb; 
} 
#img_div:after{ 
    content: ""; 
    display: block; 
    clear: both; 
} 
img{ 
    float: left; 
    margin: 5px; 
    width: 300px; 
    height: 140px; 
}</style>
<title>Image Upload</title> 
<body>Upload to azure</body>
<link rel="stylesheet" type= "text/css" href ="style.css"/> 
<div id="content"> 

  <form method="POST" action="" enctype="multipart/form-data"> 
      <input type="file" name="fileToUpload" id="fileToUpload"/> 
        
      <div> 
          <button type="submit" name="upload">UPLOAD</button> 
        </div> 
  </form> 
</div> 
</body>
</html>
 

Результат:

введите описание изображения здесь

Комментарии:

1. Я использовал функцию path info в PHP. $ext = pathinfo($path, PATHINFO_EXTENSION); Но все же файл, который я загружаю в azure, отображается без какого-либо расширения. Я не уверен, нужно ли мне что-то настраивать в хранилище больших двоичных объектов Azure

2. @SiddarthBhaire, это действительно странно, в хранилище Azure ничего не нужно настраивать. Не могли бы вы поделиться всеми своими кодами (включая файл, как его загружать), чтобы я мог протестировать его для вас?

3. Я обновил сообщение со всем кодом (я пытаюсь загрузить файлы изображений на blob, а также на сервер mysql. Я отредактировал сообщение и вставил весь код phtml). Спасибо за вашу помощь

4. @SiddarthBhaire Спасибо за ваш код, я обновил свой ответ, пожалуйста, отметьте его, если он полезен 🙂

5. Спасибо за вашу помощь! Теперь я могу загружать файлы в большой двоичный объект Azure с вашим кодом 🙂