Im new to service cloud and have been tasked with figuring out a way to save file attachments to custom objects. I believe what I have thus far accomplishes just that as I can see the new records being created in my object. My next step is to figure out a way to find uploaded files given an ID and display a clickable link that will open in a new tab to display the uploaded file's contents. (similar to the stock FileListDisplay widget). According to the Connect PHP API documentation, no ROQL query or fetch() returns any file attachment data. How would I go about displaying uploaded files?
Code so far (shortened for brevity)
View:
<form action="https://test.rightnowdemo.com/app/Upload2/uploadcontroller2" method="post" enctype="multipart/form-data" />
<div>
<h3>Select a .txt file only:</h3><br />
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<label for="userfile">Select a file:</label>
<input type="file" class="form-control" name="userfile" /><br>
<input type="submit" class="nybeButton" value="Send" />
</div>
</form>
controller:
function store_attachment($FileName, $FileLocation, $FileType)
{
$MyDocument = new RightNow\Connect\v1_1\UPLOAD\Documents();
$MyDocument->FileAttachments = new RightNow\Connect\v1_1\FileAttachmentArray();
$MyDocument->UserName = "Test user";
$fattach = new RightNow\Connect\v1_1\FileAttachment();
$fattach->ContentType = $FileType;
$file = $FileLocation;
$fattach->setFile($file);
$fattach->FileName = $FileName;
$MyDocument->FileAttachments[] = $fattach;
//\RightNow\Libraries\AbuseDetection::check();
$MyDocument->save();
}
$FileName = $_FILES["userfile"]["name"];
$FileLocation = get_cfg_var('upload_tmp_dir') . "/" . $_FILES["userfile"]["name"];
$FileType = $_FILES["userfile"]["type"];
store_attachment($FileName, $FileLocation, $FileType);
A similar question was asked on the OSvC communities lately. Generally, there's no way to get the file data through Connect for PHP; you can only set through Connect (we used to have some scripts to get around this with PHP, but I believe that Prod Dev has closed all PHP methods to access the file servers). You must use the SOAP API to retrieve the files through your code.
However, if you just want to display a link on Customer Portal to the file, then you can follow the following format, as per Arun's answer in the communities:
Download File
Related
I'm writing a piece of code that uploads a .zip file, takes the content of the .zip file and removes the .zip itself. It also changes the name of the directory based on your own input, which is required. This is the form:
<form action ="" method="post" enctype="multipart/form-data">
<div>
<p><input type="text" name="NewName" placeholder="Enter New Name" required/></p>
<p><input type="file" name="zip" required/></p>
<p><input type="submit" value="upload" /></p>
</div>
</form>
This is the php i use to rewrite the directory, which is, by default, named "NewMap"
if($_POST['NewName']){
$NewNameStr = $_POST['NewName'];
$NewNameTrim=preg_replace('/\s+/', '', $NewNameStr);
rename("uploads/NewMap/", "uploads/" . $NewNameTrim);
mkdir("uploads/NewMap/");
}
As you can see after I rename it I create the directory again for future use.
My question is the following: It is possible that the user will use a name that already exists, when this happens it does not rename anything and the map structure gets messed up. How can i check if the name already exists with $_POST['NewName']; and add a number to it? So if user1 calls his directory onions and user2 also calls his directory onions user2's directory gets called onions1
Try something like this:
$dirName = YOUR_PATH;
$directoryExists = false;
$i = 1;
$tempName = $dirName;
do{
if(file_exists($tempName)){
$tempName = $dirName.$i;
$i++;
}else{
$directoryExists = true;
$dirName = $tempName;
}
}while(!$directoryExists);
or you could just add datetime (e.g 2016082916001234) after every folders name.
I strongly recommend that you do not allow that to happen. I point out that use the id of the User, or any unique identifier and concatenate in all his folders. that is, if he wants to create a folder called potato, the actual name would be: Potatouser
I am trying to enter some data into a database and upload an image to a specific directory. I am using the following script which is a modified version of the top voted answer to this question: How to store file name in database, with other info while uploading image to server using PHP?
require($_SERVER['DOCUMENT_ROOT']."/settings/functions.php");
// This is the directory where images will be saved
$target = $_SERVER['DOCUMENT_ROOT']."/safetyarticles/images/";
$target = $target . basename( $_FILES['article_img']['name']);
date_default_timezone_set("America/Chicago");
// This gets all the other information from the form
$article_name = $_POST['article_title'];
$article_date = date("m/d/Y");
$article_creator = $_POST['article_creator'];
$article_views = "0";
$article_content = $_POST['article_content'];
$article_content_2 = $_POST['article_content_2'];
$article_img = ($_FILES['article_img']['name']);
$article_credit = $_POST['article_credit'];
// Connect to database
$conn = getConnected("safetyArticles");
// moves the image
if(move_uploaded_file($_FILES['article_img']['tmp_name'], $target))
{
// if upload is a success query data into db
mysqli_query($conn, "INSERT INTO currentArticles (article_name, article_date, article_creator, article_content, article_content_2, article_img, article_credit)
VALUES ('$article_name', '$article_date', '$article_creator', '$article_views', '$article_content', '$article_content_2', '$article_img', '$article_credit')") ;
echo "The file ". basename( $_FILES['article_img']['name']). " has been uploaded, and your information has been added to the directory";
}
else {
echo "Sorry, there was a problem uploading your file.";
}
I have successfully connected to my database since my getConnected() function contains error handling for if the connection fails.
For some reason I keep getting the Sorry, there was a problem uploading your file. error from the bottom of the script.
Am I missing something? All I did was change some minor lines here and there such as how the database connects, and the variables. I also moved the query to only happen if the file uploads.
I'm not sure what I'm missing.
Is it also possible to modify this current script to rename the image to whatever the value of $article_name is? For example if the article name is "This Is The First Article" then the image would be this-is-the-first-article.jpg?
My HTML form is:
<form method="post" action="http://example.com/admin/articleCreate.php" enctype='multipart/form-data'>
<input type="text" name="article_title" placeholder="What Is The Name Of This Article?" id="article_title_input">
<textarea name="article_content" placeholder="Write The Top Half Of Your Article Here." id="article_content_input"></textarea>
<input type="file" name="article_img" placeholder="If The Article Has An Image, Upload It Here." id="article_img_input">
<textarea name="article_content_2" placeholder="Write The Bottom Half Of Your Article Here." id="article_content_2_input"></textarea>
<input type="text" name="article_creator" placeholder="Who Is Writing This Article?" id="article_creator_input">
<input type="text" name="article_credit" placeholder="If This Article Is Copied, What Website Was It Taken From?" id="article_credit_input">
<input type="submit" value="Submit">
</form>
And I did var_dump(is_uploaded_file($_FILES['article_img']['tmp_name'])); and it's returnign true.
Sidenote edit: This being before you edited your question with only one of them being renamed. https://stackoverflow.com/revisions/36367407/4
$_FILES['photo']
$_FILES['uploadedfile']
are two different file arrays and you're using name="article_img" as the name attribute.
You need to use the same one for all of them.
Error reporting http://php.net/manual/en/function.error-reporting.php would have told you about it.
Add error reporting to the top of your file(s) which will help find errors.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Then the rest of your code
Sidenote: Displaying errors should only be done in staging, and never production.
Additional edit:
$target = $target . basename( $_FILES['photo']['name']);
if that's your real edit, still the wrong array name.
I think the problem is in this line:
if(move_uploaded_file($_FILES['photo']['tmp_name'], $target))
Change it to this:
if(move_uploaded_file($_FILES['article_img']['tmp_name'], $target))
Your html has:
<input type="file" name="article_img" placeholder="If The Article Has An Image, Upload It Here." id="article_img_input">
And your php is waiting for $_FILES['photo']['tmp_name']
Change your html file input to:
<input type="file" name="photo" placeholder="If The Article Has An Image, Upload It Here." id="article_img_input">
I am trying to upload a file onto the server using php but I need some help.
I have a html form to submit a book name and a book image. The book name will be stored in the database (see below) and the image will be stored on the server.
The id, book name, and date are being stored in the database however the image is not uploading. Please help me to sort it out.
Thanks.
Database table "books"
id int(11), book_name varchar(255), date_added date
add_book.php
<?php
$book_name = $_POST['book'];
// insert fields to database
$sql_query = mysql_query("INSERT INTO books (book_name, date_added) VALUES ('$book_name', now()");
// get id for that row
$id = mysql_insert_id();
// rename the book to that id followed by the format .jpg
$new_book_name = "$id.jpg";
// define upload path
$upload_path = "../book_images/";
// move the uploaded file to the upload path with the new name
move_uploaded_file($_FILES['upload']['tmp_name'], $upload_path . $new_book_name);
?>
<form action="add_book.php" method="post" enctype="multipart/form-data" name="bookform" id="bookform">
Book name: <input name="book" type="text" id="book" value=""/> <br />
Book image: <input type="file" name="upload" id="upload" />
<input name="submit" type="submit" value="Add book" />
</form>
Before any PHP developer begins to debug anything I always suggest in every question that do set error_reporting(E_ALL); and ini_set("display_errors", 1); at the very top of your script. This will tell you what went wrong on what line with respect to what statement/variable/constant
Anyways, you should check for validities whether the file uploads or not, its type and other such parameters. You should also store it by adding relative path with respect to your current working directory
if(isset($_FILES["upload"])&&$_SERVER["REQUEST_METHOD"]=="POST")
{
$name=$_FILES["upload"]["name"];
$tempName=$_FILES["upload"]["tmp_name"];
$size=$_FILES["upload"]["size"];
$type=$_FILES["upload"]["type"];
$realPath="bookName/Imagename/".$name;
if(($type=="image/jpg"||$type=="image/jpeg"||$type=="image/png"))
{
if(is_dir($fullDirectory)) //if directory exists, then simply move it
{
move_uploaded_file($tempName, $realPath);
}
else //if directory doesn't exist then make one and then move the file
{
mkdir($fullDirectory,0777,true);
move_uploaded_file($tempName, $realPath);
}
}
else
{
print $_FILES["upload"]["error"];
}
}
Spme thing is wrong here:
$new_book_name = "$id.jpg";
You should take file name from POST here $_FILES["upload"]["name"]. and add $id with this file name:
$new_book_name = $id."-".$_FILES["upload"]["name"];
Also check permission in your upload directory "../book_images/".
For some reason my PDF upload form is failing consistently, I have this code:
<?php
if($_POST["submit"] == "Add PDF to Comm and Special Projects")
{
$addsubp = $_POST["addsubp"];
$addsubp_name = $_POST["addsubp_name"];
$commuploadedfile = $_FILES['uploadedfile']['name'];
$sqldoc = "INSERT INTO projects_links (pid, display_name, link) VALUES ('".$addsubp."','".$addsubp_name."','".$commuploadedfile."')";
mysql_query($sqldoc) or die(mysql_error());
echo "<BR>";
$target_path = "D:\\Hosting\\69903\\html\\pdfs\\comm\\";
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "<br>The file ". basename( $_FILES['uploadedfile']['name']).
" has been uploaded<br>";
} else{
echo "<br>There was an error uploading the file, please try again.<br>";
}
}
?>
<form method="post">
Add PDF to Project for Committees and Special Projects <br>Choose Project<select name="addsubp"><?php
$query = "SELECT
projects.*
FROM
projects";
$showresult = mysql_query($query);
$csp_c = 1;
while($buyarray = mysql_fetch_assoc($showresult))
{
echo "<option value=".$buyarray['id'].">".$buyarray["pname"]."</option>";
}
?></select><br>
Choose Display Name for PDF <input type="text" name="addsubp_name" /> <Br>
Choose PDF: <input name="uploadedfile" type="file" /> <Br>
<input type="submit" value="Add PDF to Comm and Special Projects" name="submit" />
</form>
I have made sure that the application has write privileges to the "comm" directory. I have godaddy and used the file manager to make sure of that. I have had problems with permissions in this project before, so I know this isn't case. It keeps printing
There was an error uploading the file, please try again.
It doesn't attempt to upload any PDF at all, what am I doing wrong?
thanks!
You may have permissions issues, but for file uploads your form tag should contain the proper enctype attribute.
<form enctype="multipart/form-data" method="POST">
and defining a file size limit is also a good idea:
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
try checking the Upload error message: http://php.net/manual/en/features.file-upload.errors.php
Your code is blindly assuming the file upload succeeded. At bare minimum you should have something like
if ($_FILES['uploadedfile']['error'] === UPLOAD_ERR_OK) {
... handle the upload
}
Your code is vulnerable to SQL injection. You do not escape any of the 3 values you're inserting into the database
You're creating the database record before making sure the file was successfully moved into the target directory. What happens if the file can't be written for any reason (as it is now with your problem)? The database will say it's there, file system will say it isn't
You're not checking for file collisions. If two seperate uploads send "file.txt", the second upload will overwrite the first one.
You're storing the files with the user-supplied name, which is under user control. If this file is web-accessible, anyone with access to your upload form can upload anything they want (e.g. a php file) and the server will happily execute it for them.
I want any php script which can demonstrate me how to upload multiple files in PHP. In my application I have given a link "Add Image" & 'Remove Image', on click of "Add Image" I am adding a new upload field on the page using javascript, using which user can upload more and more images, no limit on number of images for now. On click of delete i am removing that element.
I am just not getting the concept on how to process them in the POST request in PHP. I know in HTML if we give the name of field like myimages[] then it will create a PHP array, but how to process this.
I don't want to use AJAX/JavaScript for uploading, want to do it with traditional POST request in PHP.
If anyone have any link or code which shows such functionality, then pleas provide it will be really helpful.
Thanks!
combine this uploading multiple files & move_uploaded_file
<form action="file-upload.php" method="post" enctype="multipart/form-data">
Send these files:<br />
<input name="userfile[]" type="file" /><br />
<input name="userfile[]" type="file" /><br />
<input type="submit" value="Send files" />
</form>
$uploads_dir = '/uploads';
foreach ($_FILES["userfile"]["error"] as $key => $error)
{
if ($error == UPLOAD_ERR_OK)
{
$tmp_name = $_FILES["userfile"]["tmp_name"][$key];
$name = $_FILES["userfile"]["name"][$key];
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
}
Uploaded files are not in the POST array, they are in the FILES array.
http://www.php.net/manual/en/features.file-upload.multiple.php
The files are uploaded to a temp area with "safe" names. The array will contain the name of the file and the tmp file. You can then move them to where you want.
Name file input fields as file[] in HTML, then just run a loop from 0 do count($_FILES) in PHP...
for($i = 0; $i < count($_FILES['file']['tmp_name']); $i++){
$tmp = $_FILES['file']['tmp_name'][$i];
$name = md5(microtime());
if(move_uploaded_file($tmp, "dir/$name.jpg")){
echo "File '$tmp' uploaded successfully";
}else{
echo "Uploading '$tmp' failed";
}
}
I've implemented something similar in the past as follows:
Have a hidden JavaScript form variable (e.g.: "numuploads") that stores the number of file inputs currently in the form. This will need to be incremented/decremented when you add/remove an input on the front end.
Name each of the inputs on the front end using a pattern such as "upload_X", where X is the next in the sequence. (Effectively the same as the counter above -1.)
On the PHP landing page, simply scan the $_FILES superglobal, looking for each "upload_X" where X is zero thru numuploads - 1.
You can then carry out the required logic for each of the uploaded files, other form elements, etc.