আমি কীভাবে জনসাধারণের জন্য পথ পাব: //


43

আমার জনসাধারণের জন্য পথটি পাওয়া দরকার: // রানটাইমে। এটি পেতে আমি কি কোনও ফাংশন ব্যবহার করতে পারি?

উত্তর:


34

জনগণের আসল পথটি পেতে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন: //।

if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $realpath = $wrapper->realpath();
  // ...
}

এই কোডটি file_create_url()নিম্নলিখিত পার্থক্য সহ কোডটি ব্যবহার করা কোডটির সরলিকৃত সংস্করণ :

  • এটি তৃতীয় পক্ষের মডিউলগুলিকে ইউআরএল পরিবর্তন করতে দেয় না, যেহেতু ওপি জনসাধারণের সাথে সম্পর্কিত পথটি জিজ্ঞাসা করছে: //
  • এটি পরিষ্কারভাবে সত্য যেহেতু এটি ইউআরআই রয়েছে: // পরীক্ষা করে না
  • এটি ইউআরআই কোনও মূল-সম্পর্কিত আপাতত ইউআরআই পরীক্ষা করে না, যেহেতু এটি জনসাধারণের পক্ষে পরিষ্কারভাবে মিথ্যা: //
  • এটি ইউআরআই প্রোটোকল সম্পর্কিত কিনা তা পরীক্ষা করে না, কারণ এটি ওপির ক্ষেত্রে স্পষ্টতই মিথ্যা
  • এটি ইউআরআই সঠিকভাবে ফর্ম্যাট করা স্ট্রিম নয় তা জনসাধারণ: // থেকে সঠিকভাবে ফর্ম্যাটেড স্ট্রিম হিসাবে পরীক্ষা করে না
  • এই স্কিমটি HTTP বা https কিনা তা এটি পরীক্ষা করে না, যেহেতু এই ক্ষেত্রেটি সর্বজনীন
  • $wrapper->getExternalUrl()ওপি ইউআরএল জন্য নয়, পথ জিজ্ঞাসা করছে বলে এটি কল করে না

যদি ওপি জনসাধারণের জন্য ইউআরএল চাইত: //, আমি নিম্নলিখিত কোডটি ব্যবহার করতাম, এটি এখনও দ্রুপাল ফাংশন দ্বারা ব্যবহৃত কোডটির একটি সরলিকৃত সংস্করণ, যা আরও জেনেরিক হওয়া দরকার।

if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $url = $wrapper->getExternalUrl();
}

3
@ জুনেদকাজির একটি উত্তম উত্তর।
এলেসম্যাসচারপা

1
ব্যবহৃত কোডটি পড়ুন file_create_url(); আপনি মৃত্যুদণ্ডপ্রাপ্ত কোডটি দেখতে পাবেন, এই ক্ষেত্রে, আমি আমার উত্তরে যা লিখেছিলাম তা হ'ল।
kiamlaluno

1
এটি আপনাকে url নয় পুরো সার্ভার পাথটি দেবে।
ড্রকর্ড

@ ডিসকর্ড এটি আপনাকে একই জিনিস file_create_url()দেয় যা আপনাকে দেয়।
kiamlaluno

1
না এটি করে না, এটি আপনাকে সার্ভারের মতো পথ দেয়/var/www/webroot/etc/more_folders/
ড্রকর্ড

39

আপনি file_create_url ফাংশনটি ব্যবহার করতে পারেন ।

$uri = 'public://';
$path= file_create_url($uri)

এটি আপনাকে url দেয় তবে সার্ভারটি সহ including আমি global $base_urlএটিকে সরাতে এবং এই সার্ভারটি অজ্ঞেয় তৈরি করতে একটি সাধারণ রেইজেক্স এবং এটি ব্যবহার করেছি । global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);'রেগেক্সে' # ব্যবহার করার বিষয়টি নিশ্চিত করুন, নইলে $ বেস_আরএল-এ-পালানো '/' এর কারণে প্রতিস্থাপনটি ব্যর্থ হবে।
ড্রকর্ড

3
ওপি ইউআরএল নয়, পথ চেয়েছিল।
কিমলালুনো

20

আপনি যদি কেবল স্থানীয় ফাইল ( রিমোট নয়! ) ব্যবহার করেন তবে আপনি drupal_relpath () ব্যবহার করে দেখতে পারেন

$path = 'public://custom_map';
drupal_realpath($path);

এটি ফিরে আসবে:

D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map

4
এটি URL না, এমন একটি পথ ফেরায় যা প্রশ্নটি জিজ্ঞাসা করে। আমার মতে এটি গৃহীত উত্তরের চেয়ে ভাল।
স্কট জৌদ্রি

api.drupal.org/api/drupal/includes!file.inc/function/… । drupal_relpath () মন্তব্যে দেখা হিসাবে অবচয় করা হয়।
ওয়ার্ডজিলা

1
@ ওয়ার্ডজিলা, ভাল না। আপনি যদি সর্বশেষ দ্রুপাল উত্সটি পরীক্ষা করেন তবে আপনি এটি ব্যবহার করতে পারবেন প্রচুর পরিমাণে, এটি অবহ্রাসিত নয় তবে অবশ্যই এর ব্যবহারকে সীমাবদ্ধ করতে হবে। ফাইল.ইনে ডকুমেন্টেশন বলে যে এটি "নিরুৎসাহিত", তবে অবহেলিত নয়।
আন্দ্রে রুডেনকো

@ স্কটজৌদ্রি ওপি ইউআরএল নয়, জনসাধারণের জন্য পথ চেয়েছে : //
কিমলালুনো

@ ওয়ার্ডজিলা: দস্তাবেজগুলি বলে না যে এটি অবহেলা করা হয়েছে; তারা বলেছিল এটি নিরুৎসাহিত করা হয়েছে কারণ এটি কেবল স্থানীয় ফাইল পাথগুলি পরিচালনা করে (যা পাবলিক ফাইল সিস্টেমটি হবে)। দস্তাবেজগুলি থেকে: "কেবলমাত্র এই ফাংশনটি ব্যবহার করুন যদি আপনি জানেন যে ইউআরআইতে প্রবাহের মোড়ক স্থানীয় ফাইল সিস্টেম ব্যবহার করে এবং আপনার কোনও ফাংশনের কাছে একটি নিখুঁত পথটি প্রবাহিত করতে হবে যা স্ট্রিম ইউআরআইয়ের সাথে সঙ্গতিপূর্ণ নয়" "
গাইপ্যাডক

3

নিম্নলিখিত উদাহরণগুলি দেখুন:

$scheme = file_uri_scheme($file);

if ($scheme && file_stream_wrapper_valid_scheme($scheme)) {
  $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
  $path = $wrapper->getLocalPath($file);
}

বা:

$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
$path = $wrapper->getDirectoryPath() . "/" . file_uri_target($uri);
print $path;

এর জন্য এপিআই পরীক্ষা করুন DrupalPublicStreamWrapper

ব্যবহার file_create_url()সমস্ত ক্ষেত্রে কাজ করে না (যেমন অন্যান্য উত্তরগুলি বোঝায়), কারণ ফেরত ইউআরএল একই সার্ভারে থাকা উচিত নয়। এবং $_SERVER['DOCUMENT_ROOT']শুধুমাত্র নির্দিষ্ট সার্ভার কনফিগারেশনের জন্য কাজ করে ।

আপনি যদি স্ট্রিম মোড়ক ব্যবহার করতে না চান তবে আপনি সহজ সমাধান চেষ্টা করতে পারেন:

$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);

অন্যথায় আপনার যদি এমন কিছু প্রয়োজন হয় যা আরও সাধারণভাবে কাজ করে তবে @ হান্নান এক্সপ্লোর সমাধানটি দেখুন:

$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
if ($wrapper instanceof DrupalLocalStreamWrapper) {
  $path = $wrapper->getDirectoryPath() . '/' . file_uri_target($uri);
}
else {
  // This does not appear to be a local file so there's no such thing as
  // a relative path; do appropriate error handling here.
}

আরও পড়ুন: আমি কীভাবে কোনও ফাইল ইউরিকে আপেক্ষিক পথে রূপান্তর করতে পারি?


সম্পর্কিত:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.