我试图创建一种方法将文件流上传到共享点到目前为止我有这个
<?php
namespace app\controllers;
use Yii;
use app\models\FeuilleDeJourResponsable;
use app\models\MeteoPrevision;
use app\models\PosteFdj;
use app\models\CategorieFdj;
use app\models\Personnel;
use app\models\FeuilleDeJourResponsableSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
/**
* FeuilleDeJourResponsableController implements the CRUD actions for FeuilleDeJourResponsable model.
*/
class FeuilleDeJourResponsableController extends Controller
{
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['POST'],
],
],
];
}
/**
* Lists all FeuilleDeJourResponsable models.
* @return mixed
*/
public function actionIndex()
{
$searchModel = new FeuilleDeJourResponsableSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single FeuilleDeJourResponsable model.
* @param string $Date_Calendaire
* @param integer $ID_Poste_FDJ
* @return mixed
*/
public function actionView($Date_Calendaire, $ID_Poste_FDJ, $ID_Categorie, $Code_Personnel)
{
return $this->render('view', [
'model' => $this->findModel($Date_Calendaire, $ID_Poste_FDJ, $ID_Categorie, $Code_Personnel),
]);
}
/**
* Creates a new FeuilleDeJourResponsable model.
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$feuille_de_jour_responsable = new FeuilleDeJourResponsable();
$meteo_prevision = new MeteoPrevision();
$poste_fdj = new PosteFdj();
$categorie_fdj = new CategorieFdj();
$personnel = new Personnel();
if ($feuille_de_jour_responsable->load(Yii::$app->request->post()) && $meteo_prevision->load(Yii::$app->request->post()) && $poste_fdj->load(Yii::$app->request->post()) && $categorie_fdj->load(Yii::$app->request->post()) && $personnel->load(Yii::$app->request->post()) && FeuilleDeJourResponsable::validateMultiple([$feuille_de_jour_responsable, $meteo_prevision, $poste_fdj, $categorie_fdj, $personnel]))
//if ($feuille_de_jour_responsable->load(Yii::$app->request->post()) && $meteo_prevision->load(Yii::$app->request->post()) && $poste_fdj->load(Yii::$app->request->post()) && $categorie_fdj->load(Yii::$app->request->post()) && $personnel->load(Yii::$app->request->post()) && FeuilleDeJourResponsable::validateMultiple([$feuille_de_jour_responsable]) && PosteFdj::validateMultiple([$poste_fdj]) && CategorieFdj::validateMultiple([$categorie_fdj]) )
{
$poste_fdj->save(false);
$categorie_fdj->save(false);
$personnel->save(false);
$feuille_de_jour_responsable->ID_Poste_FDJ = $poste_fdj->ID_Poste_FDJ; // no need for validation rule on user_id as you set it yourself
$feuille_de_jour_responsable->ID_Categorie = $categorie_fdj->ID_Categorie; // no need for validation rule on user_id as you set it yourself
$feuille_de_jour_responsable->Code_Personnel = $personnel->Code_Personnel; // no need for validation rule on user_id as you set it yourself
$feuille_de_jour_responsable->save(false); // skip validation as model is already validated
$meteo_prevision->Date_Calendaire = $feuille_de_jour_responsable->Date_Calendaire; // no need for validation rule on user_id as you set it yourself
$meteo_prevision->save(false);
return $this->redirect(['feuille_de_jour_responsable/view', 'Date_Calendaire' => $feuille_de_jour_responsable->Date_Calendaire]);
} else {
return $this->render('create', [
'feuille_de_jour_responsable' => $feuille_de_jour_responsable,
'meteo_prevision' => $meteo_prevision,
'poste_fdj' => $poste_fdj,
'categorie_fdj' => $categorie_fdj,
'personnel' => $personnel,
]);
}
}
/**
* Updates an existing FeuilleDeJourResponsable model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param string $Date_Calendaire
* @param integer $ID_Poste_FDJ
* @return mixed
*/
public function actionUpdate($Date_Calendaire/*, $ID_Poste_FDJ*/)
//public function actionUpdate($Date_Calendaire, $ID_Poste_FDJ, $ID_Categorie)
{
$feuille_de_jour_responsable = FeuilleDeJourResponsable::findOne($Date_Calendaire);
if (!$feuille_de_jour_responsable) {
throw new NotFoundHttpException("The feuille_de_jour_responsable was not found.");
}
$meteo_prevision = MeteoPrevision::findOne($feuille_de_jour_responsable->Date_Calendaire);
if (!$meteo_prevision) {
throw new NotFoundHttpException("The feuille_de_jour_responsable has no meteo_prevision.");
}
$feuille_de_jour_responsable->scenario = 'update';
$meteo_prevision->scenario = 'update';
if ($feuille_de_jour_responsable->load(Yii::$app->request->post()) && $meteo_prevision->load(Yii::$app->request->post()) && FeuilleDeJourResponsable::validateMultiple([$feuille_de_jour_responsable, $meteo_prevision/*, $poste_fdj, $categorie_fdj, $personnel*/])) {
$isValid = $feuille_de_jour_responsable->validate();
$isValid = $meteo_prevision->validate() && $isValid;
if ($isValid) {
$feuille_de_jour_responsable->save(false);
$meteo_prevision->save(false);
return $this->redirect(['feuille_de_jour_responsable/view', 'Date_Calendaire' => $Date_Calendaire]);
}
}
$poste_fdj = PosteFdj::findOne($feuille_de_jour_responsable->ID_Poste_FDJ);
if (!$poste_fdj) {
throw new NotFoundHttpException("The feuille_de_jour_responsable has no poste_fdj.");
}
$feuille_de_jour_responsable->scenario = 'update';
$poste_fdj->scenario = 'update';
if ($feuille_de_jour_responsable->load(Yii::$app->request->post()) && $poste_fdj->load(Yii::$app->request->post()) && FeuilleDeJourResponsable::validateMultiple([$feuille_de_jour_responsable, $meteo_prevision, $poste_fdj, $categorie_fdj, $personnel])) {
$isValid = $feuille_de_jour_responsable->validate();
$isValid = $poste_fdj->validate() && $isValid;
if ($isValid) {
$feuille_de_jour_responsable->save(false);
$poste_fdj->save(false);
return $this->redirect(['feuille_de_jour_responsable/view', 'ID_Poste_FDJ' => $ID_Poste_FDJ]);
}
}
$categorie_fdj = CategorieFdj::findOne($feuille_de_jour_responsable->ID_Categorie);
if (!$categorie_fdj) {
throw new NotFoundHttpException("The feuille_de_jour_responsable has no categorie_fdj.");
}
$feuille_de_jour_responsable->scenario = 'update';
$categorie_fdj->scenario = 'update';
if ($feuille_de_jour_responsable->load(Yii::$app->request->post()) && $categorie_fdj->load(Yii::$app->request->post()) && FeuilleDeJourResponsable::validateMultiple([$feuille_de_jour_responsable, $meteo_prevision, $poste_fdj, $categorie_fdj, $personnel])) {
$isValid = $feuille_de_jour_responsable->validate();
$isValid = $categorie_fdj->validate() && $isValid;
if ($isValid) {
$feuille_de_jour_responsable->save(false);
$categorie_fdj->save(false);
return $this->redirect(['feuille_de_jour_responsable/view', 'ID_Categorie' => $ID_Categorie]);
}
}
$personnel = Personnel::findOne($feuille_de_jour_responsable-> Code_Personnel);
if (!$personnel) {
throw new NotFoundHttpException("The feuille_de_jour_responsable has no personnel.");
}
$feuille_de_jour_responsable->scenario = 'update';
$personnel->scenario = 'update';
if ($feuille_de_jour_responsable->load(Yii::$app->request->post()) && $personnel->load(Yii::$app->request->post()) && FeuilleDeJourResponsable::validateMultiple([$feuille_de_jour_responsable, $meteo_prevision, $poste_fdj, $categorie_fdj, $personnel])) {
$isValid = $feuille_de_jour_responsable->validate();
$isValid = $personnel->validate() && $isValid;
if ($isValid) {
$feuille_de_jour_responsable->save(false);
$personnel->save(false);
return $this->redirect(['feuille_de_jour_responsable/view', 'Code_Personnel' => $Code_Personnel]);
}
}
}
/**
* Deletes an existing FeuilleDeJourResponsable model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* @param string $Date_Calendaire
* @param integer $ID_Poste_FDJ
* @return mixed
*/
public function actionDelete($Date_Calendaire, $ID_Poste_FDJ, $ID_Categorie, $Code_Personnel)
{
$this->findModel($Date_Calendaire, $ID_Poste_FDJ, $ID_Categorie, $Code_Personnel)->delete();
return $this->redirect(['index']);
}
/**
* Finds the FeuilleDeJourResponsable model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param string $Date_Calendaire
* @param integer $ID_Poste_FDJ
* @param integer $ID_Categorie
* @param integer $Code_Personnel
* @return FeuilleDeJourResponsable the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($Date_Calendaire, $ID_Poste_FDJ, $ID_Categorie, $Code_Personnel)
{
if (($feuille_de_jour_responsable = FeuilleDeJourResponsable::findOne(['Date_Calendaire' => $Date_Calendaire, 'ID_Poste_FDJ' => $ID_Poste_FDJ, 'ID_Categorie' => $ID_Categorie, 'Code_Personnel' => $Code_Personnel])) !== null) {
return $feuille_de_jour_responsable;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
但如果我有 public static void SPUploadFileStream(string username, string filePath, Stream fileData)
{
//string siteUrl = Configuration.SPSiteURL;
string siteUrl = SPContext.Current.Web.Url;
SPUser currentUser = SPUtils.GetCurrentUser(username);
if (currentUser == null)
{
throw new SPGappUnknownUserException(username);
}
using (SPSite site = new SPSite(siteUrl, currentUser.UserToken))
{
using (SPWeb web = site.OpenWeb())
{
bool allowWebUnsafeUpdt = web.AllowUnsafeUpdates;
if (!allowWebUnsafeUpdt)
web.AllowUnsafeUpdates = true;
try
{
SPCreateFolder(Path.GetDirectoryName(filePath), username);
SPFile newFile = web.Files.Add(filePath, fileData, true); //true = replace
}
catch (Exception ex)
{
LoggingService.LogError(ex);
//site.AllowUnsafeUpdates = allowSiteUnsefaUpdt;
web.AllowUnsafeUpdates = allowWebUnsafeUpdt;
throw new ApplicationException("ERROR "+ ex.ToString());
}
}
}
}
这样的路径,但是当我有子文件夹"FOLDER/file.jpg"
时它没有
谁能给我一些指示?
答案 0 :(得分:0)
我的猜测是问题出在你的SPCreateFolder
方法中。它应该以递归方式创建文件夹。当您尝试使用
SPFile newFile = web.Files.Add(filePath, fileData, true); //true = replace
服务器相对路径必须存在。请尝试以下方法创建文件夹
private static void SPCreateFolder(SPWeb web, string filepath)
{
// since you pass this as Path.GetDictionary it's no longer split by '/'
var foldersTree = filepath.Split('\\');
foldersTree.Aggregate(web.RootFolder, GetOrCreateSPFolder);
}
private static SPFolder GetOrCreateSPFolder(SPFolder sourceFolder, string folderName)
{
SPFolder destination;
try
{
// return the existing SPFolder destination if already exists
destination = sourceFolder.SubFolders[folderName];
}
catch
{
// Create the folder if it can't be found
destination = sourceFolder.SubFolders.Add(folderName);
}
return destination;
}
然后你可以用
执行它...
SPCreateFolder(web, Path.GetDirectoryName(filePath));
SPFile newFile = web.Files.Add(filePath, fileData, true); //true = replace
...
如果有帮助,请告诉我