我正在创建一个简单的HTTP服务器.我需要读取请求的图像并将其发送到浏览器.我正在使用此代码:
fn read_file(mut file_name: String) -> String {
file_name = file_name.replace("/", "");
if file_name.is_empty() {
file_name = String::from("index.html");
}
let path = Path::new(&file_name);
if !path.exists() {
return String::from("Not Found!");
}
let mut file_content = String::new();
let mut file = File::open(&file_name).expect("Unable to open file");
let res = match file.read_to_string(&mut file_content) {
Ok(content) => content,
Err(why) => panic!("{}",why),
};
return file_content;
}
Run Code Online (Sandbox Code Playgroud)
如果请求的文件是基于文本的,则此方法有效,但是当我想要读取图像时,我收到以下消息:
流不包含有效的UTF-8
它是什么意思以及如何解决它?
该文档String将其描述为:
UTF-8编码,可扩展的字符串.
在UTF-8的维基百科定义,会给你的背景上是一个多么伟大的交易.简短版本是计算机使用称为字节的单元来表示数据.不幸的是,用字节表示的这些数据块没有内在含义; 必须从外面提供.UTF-8是解释字节序列的一种方式,像JPEG这样的文件格式也是如此.
与大多数文本编码一样,UTF-8具有有效和无效的特定要求和字节序列.您尝试加载的图像包含一系列不能解释为UTF-8字符串的字节; 这是错误消息告诉您的内容.
要修复它,您不应该使用a String来保存任意字节集合.在Rust中,这更好地代表了Vec:
fn read_file(mut file_name: String) -> Vec<u8> {
file_name = file_name.replace("/", "");
if file_name.is_empty() {
file_name = String::from("index.html");
}
let path = Path::new(&file_name);
if !path.exists() {
return String::from("Not Found!").into();
}
let mut file_content = Vec::new();
let mut file = File::open(&file_name).expect("Unable to open file");
file.read_to_end(&mut file_content).expect("Unable to read");
file_content
}
Run Code Online (Sandbox Code Playgroud)
为了传福音,这是Rust为什么语言很好的一个很好的方面.因为有一种类型代表"一组保证为有效UTF-8字符串的字节",所以我们可以编写更安全的程序,因为我们知道这个不变量永远都是真的.我们不必在整个程序中继续检查以"确保"它仍然是一个字符串.