我正在使用PHP readfile函数来读取文件并将其打印出来:print readfile ('anyfile').这样可行,但文件的内容长度也会添加到字符串的末尾.为什么?
我有一个php文件,作为我希望人们下载的所有文件的守门人,谁有足够的特权.
我使用的代码将文件抛给用户
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Content-disposition: attachment; filename=\"".$public_filename."\"");
header("Content-Transfer-Encoding: Binary");
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header("Content-length: ".$f_filesize);
readfile($file_path);
Run Code Online (Sandbox Code Playgroud)
大多数文件都相当大...... 400mb-10GB.
什么是一个很好的方法来做到这一点,并保持真正的位置+文件名的秘密,所以人们不能直接链接到文件,但有必要通过我的download.php?文件= ID网守链接?
谢谢
编辑:我不是问如何进行用户身份验证,所有这一切都已完成.我只是问我的做法,是一个大规模的好主意.如果我继续阅读10GB文件,它似乎可能会导致内存问题.
我没有运气从我的网上商店服务.dmg.我将代码简化为以下调试,但无论我得到什么零字节文件:
header('Content-Type: application/x-apple-diskimage'); // also tried octet-stream
header('Content-Disposition: attachment; filename="My Cool Image.dmg"');
$size = filesize('/var/www/mypath/My Cool Image.dmg');
header('Content-Length: '.$size);
readfile('/var/www/mypath/My Cool Image.dmg');
Run Code Online (Sandbox Code Playgroud)
这个代码适用于我提供的许多其他文件类型:bin,zip,pdf.有什么建议?谷歌教授不是我的朋友.
我不能将服务的defualt.htm页面的头部内容包含在"工作"中.dom中的html加载,只有CSS和JS文件失败.还有更好的选择吗?我喜欢将解决方案保留在NodeJS中,但也可以打开socket.io并表达.
谢谢,下面是我正在使用的.
NodeJS为页面服务
var http = require('http'),
fs = require('fs');
fs.readFile(__dirname+'/default.htm', function (err, html) {
if (err) {
throw err;
}
http.createServer(function(request, response) {
response.writeHeader(200, {"Content-Type": "text/html"});
response.write(html);
response.end();
}).listen(port.number);
});
Run Code Online (Sandbox Code Playgroud)
Default.html页面
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="objects/css/site.css" type="text/css" />
<script src="objects/js/jquery.min.js" type="text/javascript"></script>
<script src="objects/js/site.min.js" type="text/javascript"></script>
</head>
<body></body>
</html>
Run Code Online (Sandbox Code Playgroud) 我正在创建一个子进程,并读取其输出.当子进程创建output(cmd /c echo Hello World)时,我的代码工作正常,但是如果进程没有创建output(),则ReadFile将挂起cmd /c echo Hello World > output.txt.我只是在流程终止后才开始阅读.
我做错了什么吗?无论如何使用同步模式执行此操作,还是必须使用异步模式?所有这一切都发生在一个单独的线程中,所以我不认为异步模式会给我任何好处,除非它是让这个工作的唯一方法.非常感谢!
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0);
SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0);
memset(&piProcInfo, 0, sizeof(PROCESS_INFORMATION));
memset(&siStartInfo, 0, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.hStdError = g_hChildStd_OUT_Wr;
siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(NULL, commandWideString, NULL, NULL, TRUE, 0, NULL, NULL, &siStartInfo, &piProcInfo);
while(1)
{
GetExitCodeProcess(piProcInfo.hProcess, &processExitCode);
if(processExitCode != STILL_ACTIVE)
break;
else
Sleep(1);
}
*output = (char *)calloc(32, sizeof(char));
processOutputSize = 0;
while(1) …Run Code Online (Sandbox Code Playgroud) 是否可以在远程文件上使用PHP readfile函数,该文件的大小未知且大小正在增加?这是场景:
我正在开发一个脚本,从第三方网站下载视频,同时将视频转码为MP3格式.然后通过readfile将此MP3传送给用户.
用于上述过程的查询如下:
wget -q -O- "VideoURLHere" | ffmpeg -i - "Output.mp3" > /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)
因此,文件同时被提取和编码.现在,当上述过程正在进行中时,我开始通过readfile将输出mp3发送给用户.问题是编码过程需要一些时间,因此取决于用户下载速度,readfile在整个文件被编码之前达到假定的EoF,导致用户接收部分内容/不完整文件.
我第一次尝试修复此问题是对用户下载应用速度限制,但这并非万无一失,因为编码时间和速度因负载而异,这仍然会导致部分下载.
那么有没有办法以这样的方式实现这个系统,我可以同时提供下载和编码,并保证将完整的文件发送给最终用户?
任何帮助表示赞赏.
编辑:回应彼得,我实际上正在使用fread(读取readfile_chunked):
<?php
function readfile_chunked($filename,$retbytes=true) {
$chunksize = 1*(1024*1024); // how many bytes per chunk
$totChunk = 0;
$buffer = '';
$cnt =0;
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
//usleep(120000); //Used to impose an artificial speed limit
$buffer = fread($handle, $chunksize);
echo $buffer;
ob_flush();
flush();
if ($retbytes) {
$cnt += strlen($buffer); …Run Code Online (Sandbox Code Playgroud) 我试图在常量内存中读取和写入很多整数.我已经想出了如何将内存写入内存,但还没弄清楚如何将它们读回来.
import Control.Lens (zoom)
import System.IO (IOMode(..), withFile)
import Pipes
import qualified Pipes.Prelude as P
import qualified Pipes.ByteString as PB
import qualified Pipes.Parse as P
import qualified Pipes.Binary as P
intStream :: Monad m => Proxy x' x () Int m b
intStream = go (0 :: Int) where
go i = yield i >> go (i + 1)
decoder :: Monad m => Int -> P.Parser P.ByteString m [Int]
decoder n = zoom (P.decoded . P.splitAt n) P.drawAll
main …Run Code Online (Sandbox Code Playgroud) 感谢您的关注.
我创建了一个程序,我正在使用登录表单和注册表单.一旦用户注册他们的电子邮件,他们的密码将被保存到submit.txt.然后他们将返回登录表单并输入保存到的电子邮件和密码submit.txt.
在我的代码中,我使用Register文件的写文件和Login Form的Read文件.但是,它不起作用.我在用于读取文件的代码中知道我的问题.你可以帮我实现吗?
非常感谢你的帮助.
if (checkPassword(usern, hash)) {
System.out.println("Logged in!");
ChooseWindow ptb = new ChooseWindow();
ptb.setVisible(true);
LoginWindow.this.dispose();
} else {
System.out.println("Wrong password");
}
public boolean checkPassword(String username, String pass) {
try {
FileReader inFile = new FileReader("/users/Ender/Desktop/GetUser/submit.txt");
BufferedReader inStream = new BufferedReader(inFile);
String inString;
while ((inString = inStream.readLine()) != null) {}
inStream.close();
}catch (IOException e) {
e.printStackTrace();
}
return false;
}
Run Code Online (Sandbox Code Playgroud) 我试图从连接到我的Arduino MEGA的SD卡上逐行读取文本文件"Print1.txt".到目前为止,我有以下代码:
#include <SD.h>
#include <SPI.h>
int linenumber = 0;
const int buffer_size = 54;
int bufferposition;
File printFile;
char character;
char Buffer[buffer_size];
boolean SDfound;
void setup()
{
Serial.begin(9600);
bufferposition = 0;
}
void loop()
{
if (SDfound == 0)
{
if (!SD.begin(53))
{
Serial.print("The SD card cannot be found");
while(1);
}
}
SDfound = 1;
printFile = SD.open("Part1.txt");
if (!printFile)
{
Serial.print("The text file cannot be opened");
while(1);
}
while (printFile.available() > 0)
{
character = printFile.read();
if (bufferposition …Run Code Online (Sandbox Code Playgroud) 我很难理解Python在被open编辑后删除文件时如何读取文件的概念.这是代码:
>>> import os
>>> os.system('cat foo.txt')
Hello world!
0
>>> f
<_io.TextIOWrapper name='foo.txt' mode='r' encoding='UTF-8'>
>>> os.system('rm -f foo.txt')
0
>>> os.system('cat foo.txt')
cat: foo.txt: No such file or directory
256
>>> f.read()
'Hello world!\n'
>>>
Run Code Online (Sandbox Code Playgroud)
文本和二进制模式给出相同的结果.
我也尝试过这个大小超过1Gb的大文件,删除后也会读取它们.open即使对于非常大的文件,操作也几乎瞬间发生.
如果打开的文件不再存在,Python从哪里获取数据?
我跑了这个测试
python 3.4.3 / 3.5.2ubuntu 14.04 / 16.04readfile ×10
php ×4
download ×2
arduino ×1
c++ ×1
dmg ×1
ffmpeg ×1
file ×1
filereader ×1
hang ×1
haskell ×1
http-headers ×1
io ×1
java ×1
javascript ×1
line-by-line ×1
linux ×1
node.js ×1
python ×1
sd-card ×1
static-html ×1
swing ×1
wget ×1
winapi ×1
writefile ×1