GVKun编程网logo

在PIL中打开base64字符串时出现奇怪的IOError

14

在本文中,我们将为您详细介绍在PIL中打开base64字符串时出现奇怪的IOError的相关知识,此外,我们还会提供一些关于android-在phonegap中将base64字符串转换为pdf、And

在本文中,我们将为您详细介绍在PIL中打开base64字符串时出现奇怪的IOError的相关知识,此外,我们还会提供一些关于android-在phonegap中将base64字符串转换为pdf、Android将Base64字符串发布到PHP、base64字符串转化成图片、bash脚本中的if语句出现奇怪的错误的有用信息。

本文目录一览:

在PIL中打开base64字符串时出现奇怪的IOError

在PIL中打开base64字符串时出现奇怪的IOError

我尝试在pythonshell中对图像进行编码和解码。我第一次在PIL中打开解码的base64字符串时,没有错误,如果我重复执行Image.open()命令,我将得到
IOError:无法识别图像文件。

>>> with open("/home/home/Desktop/gatherify/1.jpg", "rb") as image_file:...     encoded_string = base64.b64encode(image_file.read())>>> image_string = cStringIO.StringIO(base64.b64decode(encoded_string))>>> img = Image.open(image_string)>>> img<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=576x353 at 0xA21F20C>>>> img.show() <-- Image opened without any errors. >>> img = Image.open(image_string)Traceback (most recent call last):  File "<console>", line 1, in <module>  File "/usr/lib/python2.6/dist-packages/PIL/Image.py", line 1980, in open    raise IOError("cannot identify image file")IOError: cannot identify image file

为什么会这样呢?

答案1

小编典典

创建时image_string,您正在创建一个由字符串支持的假文件状对象。当您调用时Image.open,它将 读取
该伪造文件,并将文件指针移到文件末尾。Image.open再次尝试使用它只会给您带来EOF。

您需要重新创建StringIO对象,或重新创建seek()流的开头。

android-在phonegap中将base64字符串转换为pdf

android-在phonegap中将base64字符串转换为pdf

在我的应用程序中,我收到了代表PDF的base64字符串.我希望用户能够将base64作为pdf保存到他的手机.我一直在寻找cordova-file-transfer插件,但是它需要一个(服务器)路径,可以从中下载文件,而不是转换base64字符串.

有没有人成功使用base64字符串在phonegap中下载pdf?

解决方法:

经过更多搜索和尝试之后,我发现了一些有用的方法.

Converting base64 to pdf blob

//Helper function that converts base64 to blob
function b64toBlob(b64Data, contentType, sliceSize) {
    var input = b64Data.replace(/\s/g, ''),
        byteCharacters = atob(input),
        byteArrays = [],
        offset, slice, byteNumbers, i, byteArray, blob;

    contentType = contentType || '';
    sliceSize = sliceSize || 512;

    for (offset = 0; offset < byteCharacters.length; offset += sliceSize) {
        slice = byteCharacters.slice(offset, offset + sliceSize);

        byteNumbers = new Array(slice.length);
        for (i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        byteArray = new Uint8Array(byteNumbers);

        byteArrays.push(byteArray);
    }

    //Convert to blob. 
    try {
        blob = new Blob(byteArrays, { type: contentType });
    }
    catch (e) {
        // TypeError old chrome, FF and Android browser
        window.BlobBuilder = window.BlobBuilder ||
                             window.WebKitBlobBuilder ||
                             window.MozBlobBuilder ||
                             window.MSBlobBuilder;
        if (e.name == 'TypeError' && window.BlobBuilder) {
            var bb = new BlobBuilder();
            for (offset = 0; offset < byteArrays.length; offset += 1) {
                bb.append(byteArrays[offset].buffer);
            }                    
            blob = bb.getBlob(contentType);
        }
        else if (e.name == "InvalidStateError") {
            blob = new Blob(byteArrays, {
                type: contentType
            });
        }
        else {
            return null;
        }
    }

    return blob;
};

然后下载本身就需要cordova-file插件:

var filetoSave= b64toBlob(fileData, 'application/pdf'); 
writeFile();

function writeFile() {
    console.log("request file system");
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemRetrieved, onFileSystemFail);
}

function onFileSystemRetrieved(fileSystem) {
    console.log("file system retrieved");
    fileSystem.root.getFile(fileName, { create: true }, onFileEntryRetrieved, onFileSystemFail);
}

function onFileEntryRetrieved(fileEntry) {
    console.log("file entry retrieved");
    fileEntry.createWriter(gotFileWriter, onFileSystemFail);
}

function gotFileWriter(writer) {
    console.log("write to file");

    writer.onwrite = function (evt) {
        alert('done');
    }
    writer.write(filetoSave);

    window.open(fileName, '_blank');
}
function onFileSystemFail(error) {
    console.log(error.code);
    alert(error.code)
}

Android将Base64字符串发布到PHP

Android将Base64字符串发布到PHP

-– -–解决方案— -–
问题在我们的服务器上。如果将www放在域名前面,它只能处理发帖请求。这就是造成问题的原因。我将第一个答案设置为THE答案,因为一旦我整理出网址,它便会起作用。


原始问题

我的PHP脚本中有一个POST变量,始终为空。
我试图更改变量的名称,变量的内容等。

问题必须存在于Java代码中,因为当我var_dump()在php中请求时,它为null。

这是我的情况:

我让用户拍摄照片,将照片保存到SD卡,然后得到图像的路径,最后将其转换为Base64字符串。然后,我想将此base64字符串发布到一个php脚本中,该脚本会将其从Base64转换回,并将其作为映像写入服务器硬盘驱动器中,如下所示:

File f = new File(savedImagePath);Bitmap bitmap = BitmapFactory.decodeFile(f.getPath());          ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 30, stream); byte [] byte_arr = stream.toByteArray();String image_str = Base64.encodeToString(byte_arr, Base64.DEFAULT);HttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost("http://myURL/uploadImage.php");List<NameValuePair> pairs = new ArrayList<NameValuePair>();pairs.add(new BasicNameValuePair("image", image_str));post.setEntity(new UrlEncodedFormEntity(pairs));HttpResponse response = client.execute(post);

在服务器端,这就是我的PHP脚本:

<?php$base = $_POST["image"];$binary=base64_decode($base);header(''Content-Type: bitmap; charset=utf-8'');$file = fopen(''uploaded_image.jpg'', ''w'');fwrite($file, $binary);fclose($file);echo "script done executing";?>

这是我要发布的Base64字符串的示例:

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

答案1

小编典典

这是图像的代码:

ByteArrayOutputStream bao = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bao);byte [] ba = bao.toByteArray();String ba1=Base64.encodeBytes(ba);ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();nameValuePairs.add(new BasicNameValuePair("image",ba1));

这是用于将图像发送到服务器的HTTP代码:

HttpClient httpclient = new DefaultHttpClient();HttpPost httppost = new HttpPost("http://servername.com/uploadimage.php");httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));        HttpResponse response = httpclient.execute(httppost);HttpEntity entity = response.getEntity();is = entity.getContent();

如果您发现更多困难,请询问我或进行检查:

  • 这个类似的图片上传教程
  • Base64示例

在PHP头文件中的更改:

header(''Content-Type: image/jpg; charset=utf-8'');$base=$_REQUEST[''image''];

base64字符串转化成图片

base64字符串转化成图片

package com.dhht.wechat.util;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.*;

/**
* @Author: sh
* @Description: ImgUtil
* @Date: 9:14 2019/7/1
*/
public class ImgUtil {


/**
* 图片转化成base64字符串
*
* @param imgPath
* @return
*/
public static String GetImageStr(String imgPath) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
String imgFile = imgPath;// 待处理的图片
InputStream in = null;
byte[] data = null;
String encode = null; // 返回Base64编码过的字节数组字符串
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
try {
// 读取图片字节数组
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
encode = encoder.encode(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return encode;
}

/**
* base64字符串转化成图片
*
* @param imgData 图片编码
* @param imgFilePath 存放到本地路径
* @return
* @throws IOException
*/
@SuppressWarnings("finally")
public static boolean GenerateImage(String imgData, String imgFilePath) throws IOException { // 对字节数组字符串进行Base64解码并生成图片
if (imgData == null) // 图像数据为空
return false;
BASE64Decoder decoder = new BASE64Decoder();
OutputStream out = null;
try {
out = new FileOutputStream(imgFilePath);
// Base64解码
byte[] b = decoder.decodeBuffer(imgData);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 调整异常数据
b[i] += 256;
}
}
out.write(b);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
out.flush();
out.close();
return true;
}
}
}

bash脚本中的if语句出现奇怪的错误

bash脚本中的if语句出现奇怪的错误

如何解决bash脚本中的if语句出现奇怪的错误?

我在bash中创建了一个用于显示日志的简单脚本,阅读了bash脚本的文档,实际上我所做的一切都正确,但是我的脚本无法正常工作。我真的是sh脚本中的新秀,所以我需要在这里询问。 所以我的脚本是:

#!/bin/bash

echo How many lines of log you want to see: 
read linesCount
echo ''What type of log you want to see? (info / error / warn) type all or just hit enter to see all types of logs.''
read logType

if [${#logType} -lt 3]
then
        tail -n $linesCount root/projects/retwiter/logs/logs.log |grep $logType
fi

当我运行脚本时,它向我显示了以下内容: show-retwiter-logs.sh: 8: show-retwiter-logs.sh: [5: not found 在第二个“记录”中,我输入了错误,这就是为什么它显示了它-> [5: not found 但我实际上不知道为什么

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

今天的关于在PIL中打开base64字符串时出现奇怪的IOError的分享已经结束,谢谢您的关注,如果想了解更多关于android-在phonegap中将base64字符串转换为pdf、Android将Base64字符串发布到PHP、base64字符串转化成图片、bash脚本中的if语句出现奇怪的错误的相关知识,请在本站进行查询。

本文标签: