--- includes/file.inc
+++ includes/file.inc
@@ -1521,9 +1521,10 @@ function file_save_upload($source, $validators = array(), $destination = FALSE,
 
   // Move uploaded files from PHP's upload_tmp_dir to Drupal's temporary
   // directory. This overcomes open_basedir restrictions for future file
-  // operations.
+  // operations. drupal_realpath() needs to be used as streams don't work
+  // when safe_mode or open_basedir are set.
   $file->uri = $file->destination;
-  if (!move_uploaded_file($_FILES['files']['tmp_name'][$source], $file->uri)) {
+  if (!move_uploaded_file($_FILES['files']['tmp_name'][$source], drupal_realpath($file->uri))) {
     form_set_error($source, t('File upload error. Could not move uploaded file.'));
     watchdog('file', 'Upload error. Could not move uploaded file %file to destination %destination.', array('%file' => $file->filename, '%destination' => $file->uri));
     return FALSE;
