image use - حفظ الصورة من عنوان PHP




intervention crop (9)

أحتاج إلى حفظ صورة من عنوان PHP URL إلى جهاز الكمبيوتر الخاص بي. لنفترض أن لدي صفحة ، http://example.com/image.php ، تحمل صورة "زهرة" واحدة ، ولا شيء آخر. كيف يمكنني حفظ هذه الصورة من عنوان URL باسم جديد (باستخدام PHP)؟


Answers

هنا تذهب ، على سبيل المثال يحفظ الصورة عن بعد إلى image.jpg.

function save_image($inPath,$outPath)
{ //Download images from remote server
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8192))
    {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
}

save_image('http://www.someimagesite.com/img.jpg','image.jpg');

لم أتمكن من تشغيل أي من الحلول الأخرى ، ولكنني تمكنت من استخدام wget:

$tempDir = '/download/file/here';
$finalDir = '/keep/file/here';
$imageUrl = 'http://www.example.com/image.jpg';

exec("cd $tempDir && wget --quiet $imageUrl");

if (!file_exists("$tempDir/image.jpg")) {
    throw new Exception('Failed while trying to download image');
}

if (rename("$tempDir/image.jpg", "$finalDir/new-image-name.jpg") === false) {
    throw new Exception('Failed while trying to move image file from temp dir to final dir');
}

$content = file_get_contents('http://example.com/image.php');
file_put_contents('/my/folder/flower.jpg', $content);

إذا كان لديك allow_url_fopen مضبوطا على true :

$url = 'http://example.com/image.php';
$img = '/my/folder/flower.gif';
file_put_contents($img, file_get_contents($url));

عدا ذلك ، استخدم cURL :

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);

قم بإنشاء مجلد باسم الصور الموجودة في المسار الذي تخطط لوضع نص PHP الذي أنت على وشك إنشاءه. تأكد من أن لديه حقوق الكتابة للجميع أو لن تعمل النصوص (لن تتمكن من تحميل الملفات في الدليل).


$img_file='http://www.somedomain.com/someimage.jpg'

$img_file=file_get_contents($img_file);

$file_loc=$_SERVER['DOCUMENT_ROOT'].'/some_dir/test.jpg';

$file_handler=fopen($file_loc,'w');

if(fwrite($file_handler,$img_file)==false){
    echo 'error';
}

fclose($file_handler);

لم يعمل إجابة فارتك مع cURL بالنسبة لي. فعلت ذلك ، مع تحسن طفيف بسبب مشكلتي محددة.

على سبيل المثال،

عندما يكون هناك إعادة توجيه على الخادم (مثل عندما تحاول حفظ صورة ملف الفيس بوك) ، ستحتاج إلى مجموعة الخيارات التالية:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

يصبح الحل الكامل:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);

انظر file() PHP Manual :

$url    = 'http://mixednews.ru/wp-content/uploads/2011/10/0ed9320413f3ba172471860e77b15587.jpg';
$img    = 'miki.png';
$file   = file($url);
$result = file_put_contents($img, $file)

كان لي نفس هذه المشكلة وحلها عن طريق تجنب وظائف BitmapFactory.decodeStream أو decodeFile واستخدامها بدلا من ذلك BitmapFactory.decodeFileDescriptor

يبدو decodeFileDescriptor أنه يستدعي أساليب محلية مختلفة من decodeStream / decodeFile.

على أي حال ، ما نجح في ذلك (لاحظ أني أضفت بعض الخيارات كما كان لدى البعض أعلاه ، ولكن هذا ليس هو الذي أحدث الفرق. ما هو الحرج هو الدعوة إلى BitmapFactory.decodeFileDescriptor بدلاً من decodeStream أو decodeFile ):

private void showImage(String path)   {
    Log.i("showImage","loading:"+path);
    BitmapFactory.Options bfOptions=new BitmapFactory.Options();
    bfOptions.inDither=false;                     //Disable Dithering mode
    bfOptions.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
    bfOptions.inInputShareable=true;              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
    bfOptions.inTempStorage=new byte[32 * 1024]; 


    File file=new File(path);
    FileInputStream fs=null;
    try {
        fs = new FileInputStream(file);
    } catch (FileNotFoundException e) {
        //TODO do something intelligent
        e.printStackTrace();
    }

    try {
        if(fs!=null) bm=BitmapFactory.decodeFileDescriptor(fs.getFD(), null, bfOptions);
    } catch (IOException e) {
        //TODO do something intelligent
        e.printStackTrace();
    } finally{ 
        if(fs!=null) {
            try {
                fs.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    //bm=BitmapFactory.decodeFile(path, bfOptions); This one causes error: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

    im.setImageBitmap(bm);
    //bm.recycle();
    bm=null;



}

أعتقد أن هناك مشكلة في الوظيفة الأصلية المستخدمة في decodeStream / decodeFile. لقد أكدت أنه يتم استدعاء طريقة محلية مختلفة عند استخدام decodeFileDescriptor. أيضا ما قرأته هو "أن الصور (الصور النقطية) لا يتم تخصيصها بطريقة جافا القياسية ولكن عبر المكالمات المحلية ؛ تتم عمليات التخصيص خارج الكومة الظاهرية ، ولكن يتم حسابها ضدها! "





php image