2015-06-26 5 views
8

मैं एक एफ़टीपी सर्वर पर एक फाइल अपलोड करना चाहता हूं, लेकिन फाइल सामग्री एक वैरिएबल में आयोजित की जाती है, वास्तविक वास्तविक फ़ाइल में नहीं। मैं एक फ़ाइल का उपयोग करने से बचना चाहता हूँ; यह (संभवतः) गैर-सुरक्षित प्रणाली (*) पर संवेदनशील डेटा से निपटने के साथ-साथ फ़ाइल हैंडलिंग के पहले से ही कम (ओवरहेड) ओवरहेड को कम करने के लिए सुरक्षा जोखिमों से बचने के लिए है।स्ट्रिंग वेरिएबल (कोई स्थानीय फ़ाइल) से सामग्री के साथ एफ़टीपी साइट पर एक फाइल डालें

लेकिन PHP का एफ़टीपी एपीआई केवल ftp_put फ़ंक्शन के माध्यम से स्थानीय फ़ाइलों से फ़ाइलों को अपलोड करने की पेशकश करता है या (जब फ़ाइल पहले से ही फ़ाइल हैंडल के रूप में खोली जाती है) ftp_fput

$tmpfile = tmpfile(); 
fwrite($tmpfile, $content); 
fseek($tmpfile, 0); 
ftp_fput($ftp, $filename, $tmpfile, FTP_BINARY); 

वहाँ स्थानीय (PHP) स्थल पर सभी पर फ़ाइलों का उपयोग किए बिना एक सरल तरीका है:

वर्तमान में, मैं एक अस्थायी फ़ाइल जिसमें मैं अपलोड करने से पहले सामग्री लिखने के साथ इस समारोह का उपयोग करें?

वहाँ ftp_raw जो मनमाने ढंग से आदेश भेजने के लिए इस्तेमाल किया जा सकता है, तो मैं PUT आदेश मैन्युअल रूप से जारी कर सकता है, हालांकि मैं एक तरह से मैन्युअल रूप से डेटा चैनल पर डेटा लिखने के लिए नहीं दिख रहा है ...

मुझे नहीं पता कि यह महत्वपूर्ण है, लेकिन एफ़टीपी कनेक्शन एसएसएल (ftp_ssl_connect) के साथ सुरक्षित है।


(*) केवल पढ़ने के लिए परिदृश्य में जहाँ एक हमलावर है पूरे फाइल सिस्टम पर नियंत्रण पर विचार करें।

http://php.net/manual/en/function.fopen.php

और फिर fwrite का उपयोग कनेक्शन के लिए स्ट्रिंग लिखने के लिए:

उत्तर

12

यह कोई अंतिम समाधान हो सकता है, लेकिन मुझे लगता है कि अभी भी मूल दृष्टिकोण से बेहतर है:

आप एक पीएचपी स्मृति धारा का उपयोग करके फाइल सिस्टम पर अस्थायी फ़ाइलों से बच सकते हैं। यह मूल रूप से एक फ़ाइल हैंडल रैपर है जो (दृश्यों के पीछे) कोई वास्तविक फ़ाइल का उपयोग नहीं करता है बल्कि इसके बजाय स्मृति का कुछ हिस्सा है।

तो वस्तुतः आप अभी भी एक फ़ाइल संभाल (ताकि ftp_fput खुश है) का उपयोग करें, लेकिन कोई वास्तविक फ़ाइल (ताकि कोई फाइल डिस्क पर लिखी है और भूमि के ऊपर कम से कम रखा जाता है)।

$tmpfile = fopen('php://memory', 'r+'); 
fputs($tmpfile, $content); 
rewind($tmpfile); // or fseek 

ध्यान दें कि जब कई फ़ाइल अपलोड करना, आप आगे भूमि के ऊपर सभी फ़ाइलों के लिए एक ही फाइल संभाल पुन: उपयोग (जब तक आप प्रक्रिया parallelize, निश्चित रूप से) से कम से कम कर सकते हैं। इस मामले में, ftp_fput के बाद फ़ाइल को रिवाइंड करें और ftruncate($tmpfile, 0) का उपयोग करके इसे छोटा करें।

+1

क्यों इस परम समाधान नहीं है, यह है क्योंकि यह एक तरह से hacky है, या क्योंकि यह जोखिम पैदा करता है? – Martijn

+1

@ मार्टिजन वेल, मेरे लिए यह सिर्फ हैकी लगता है - कोई सुरक्षा चिंता नहीं है। मैं 'ftp_puts' (स्ट्रिंग तर्क से डेटा डाल) की तरह कुछ ढूंढ रहा था, जो अस्तित्व में प्रतीत नहीं होता है। आम तौर पर, PHP का प्रोटोकॉल "रैपर" एपीआई ऐसी लापता एपीआई कार्यक्षमता को बाधित करने की अनुमति देता है, जो मुझे हैकी लगता है लेकिन "काल्पनिक" फ़ाइलों के साथ कुछ करने का "सामान्य" तरीका प्रतीत होता है, जब कुछ अन्य एपीआई केवल हैंडलिंग फाइलें प्रदान करता है जैसे एफ़टीपी एपीआई। किसी को यह सुरुचिपूर्ण लग सकता है, किसी और को यह हैकी लगता है। ;) – leemes

2

fopen FTP के माध्यम से कनेक्ट करने के लिए सक्षम होना चाहिए

http://php.net/manual/en/function.fwrite.php

fwrite का दूसरा पैरामीटर स्ट्रिंग की जरूरत है वह यह है कि लिखा जाना - आपको वहां फाइल की आवश्यकता नहीं है।

0

----- एफ़टीपी पुट सामग्री (PHP 7।0) ---

$tmpFile = tmpfile(); 
fwrite($tmpFile, $contents); 
rewind($tmpFile); 
$tmpMetaData = stream_get_meta_data($tmpFile); 

if (ftp_put($ftpObj, $remoteFile, $tmpMetaData['uri'], FTP_ASCII)) { 
     echo "success"; 
}else { 
     echo "fail" 
} 
fclose($tmpFile); 
2
कोई स्थानीय शामिल फ़ाइल (ftp_fput) के साथ

:

$stream = fopen('php://memory','r+'); 
fwrite($stream, $newFileContent); 
rewind($stream); 

$success = ftp_fput($connectionId, "remoteFileName", $stream, FTP_BINARY); 

fclose($stream); 
संबंधित मुद्दे