2013-11-02 79 views
1

我是PHP和Objective-C的新手,我已经搜索了这个答案,但一切看起来很复杂,我无法理解。我正尝试使用PHP将图像文件上传到我的ftp服务器。PHP - 未能打开流:没有这样的文件或目录

我用这个代码在我的应用程序的图片上传:

UIImage *myImage = [UIImage imageNamed:@"black_strip.png"]; 
    NSData *imageData = UIImagePNGRepresentation(myImage); 
    // setting up the URL to post to 
    NSString *urlString = @"http://www.myurl.net/GagVidApp/uploadProfImage.php"; 

    // setting up the request object now 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:urlString]]; 
    [request setHTTPMethod:@"POST"]; 

    NSString *boundary = @"---------------------------14737809831466499882746641449"; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

    /* 
    now lets create the body of the post 
    */ 
    NSMutableData *body = [NSMutableData data]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Disposition: form-data; name=\"userfile\"; filename=\"ipodfile.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[NSData dataWithData:imageData]]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    // setting the body of the post to the reqeust 
    [request setHTTPBody:body]; 

    // now lets make the connection to the web 
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

    NSLog(@"returnString: %@", returnString); 

这里是我的PHP代码:

<?php 
$file = basename($_FILES['userfile']['name']); 
$remote_file = basename($_FILES['userfile']['name']); 
//$remote_file = 'readme.txt'; 

// set up basic connection 
$ftp_server = "www.myurl.net"; 
$ftp_user_name = "myusername"; 
$ftp_user_pass = "mypassword"; 
$conn_id = ftp_connect($ftp_server); 

// login with username and password 
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 

// check connection 
if ((!$conn_id) || (!$login_result)) { 
    echo "FTP connection has failed!"; 
    echo "Attempted to connect to $ftp_server for user $ftp_user_name"; 
    exit; 
} else { 
    echo "Connected to $ftp_server, for user $ftp_user_name"; 
} 
// upload a file 
if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) { 
echo "successfully uploaded $file\n"; 
} else { 
echo "There was a problem while uploading $file\n"; 
} 

// close the connection 
ftp_close($conn_id); 
?> 

返回字符串我在我的应用程序得到的是:

returnString: Connected to www.myurl.net, for user myuser<br /> 
<b>Warning</b>: ftp_put(ipodfile.png) [<a href='function.ftp-put'>function.ftp-put</a>]: **failed to open stream: No such file or directory in** <b>/home/load2unet/domains/myurl.net/public_html/GagVidApp/uploadProfImage.php</b> on line <b>24</b><br /> 
There was a problem while uploading ipodfile.png 

我一直在试图找到答案,但没有得到任何运气。任何帮助将非常感谢!谢谢

回答

1

正如Peter所说,我怀疑问题是没有引用临时文件的完整路径,即$_FILES["userfile"]["tmp_name"]。这里是我在过去的习惯,用move_uploaded_file而不是FTP,但你可能有想法的演绎:

<?php 

header('Content-Type: application/json'); 

$allowedExts = array("jpg", "jpeg", "gif", "png"); 
$extension = end(explode(".", $_FILES["userfile"]["name"])); 
if ((($_FILES["userfile"]["type"] == "image/gif") 
    || ($_FILES["userfile"]["type"] == "image/jpeg") 
    || ($_FILES["userfile"]["type"] == "image/png") 
    || ($_FILES["userfile"]["type"] == "image/pjpeg")) 
    && ($_FILES["userfile"]["size"] < 200000) 
    && in_array($extension, $allowedExts)) 
{ 
    if ($_FILES["userfile"]["error"] > 0) 
    { 
     echo json_encode(array("error" => $_FILES["userfile"]["error"])); 
    } 
    else 
    { 
     if (file_exists("upload/" . $_FILES["userfile"]["name"])) 
     { 
      echo json_encode(array("error" => $_FILES["userfile"]["name"] . " already exists")); 
     } 
     else 
     { 
      move_uploaded_file($_FILES["userfile"]["tmp_name"], "upload/" . $_FILES["userfile"]["name"]); 
      echo json_encode(array("success" => true, 
            "upload" => $_FILES["userfile"]["name"], 
            "type"  => $_FILES["userfile"]["type"], 
            "size"  => ($_FILES["userfile"]["size"]/1024) . " kB", 
            "stored in" => "upload/" . $_FILES["userfile"]["name"])); 
     } 
    } 
} 
else 
{ 
    echo json_encode(array("error" => "Invalid file")); 
} 
?> 

也许你并不需要的文件大小检查(或200K可能不是正确的阈值),所以这取决于你。但请注意,对于编程接口,我使用JSON格式化响应,因此我的应用可以轻松解析响应。

1

文件上传存储在一个临时文件夹中。由于您只提供文件的基本名称(basename($_FILES['userfile']['name']),因此文件在当前路径中搜索,但它不在那里。提供完整的路径,您的脚本将工作。

+0

我该怎么做?你能给我一些示例代码吗? – tnylee

+0

还没有尝试过,但最有可能''ftp_put($ connid,$ remote_file,$ _FILES ['userfile'] ['tmp_name'],FTP_ASCII)''会起作用。 –

相关问题