Загрузка файла с другим именем к сохраненному имени

Этот вид вещи всегда является вопросом вкуса.

Однако я всегда предпочитаю делать свою координацию (#2) через объекты модели. Контроллер представления верхнего уровня загружает или создает модели, в которых он нуждается, и каждый контроллер представления устанавливает свойства в своих дочерних контроллерах, чтобы сказать им, с какими объектами модели они должны работать. Большинство изменений передается, создают резервную копию иерархии при помощи NSNotificationCenter; увольнение уведомлений обычно встраивается к самой модели.

, Например, предположите, что у меня есть приложение с Учетными записями и Транзакциями. У меня также есть AccountListController, AccountController (который отображает информацию о состоянии счета с "шоу все транзакции" кнопка), TransactionListController и TransactionController. AccountListController загружает список всех учетных записей и отображает их. Когда Вы касаетесь на элементе списка, он устанавливает .account свойство своего AccountController и продвигает AccountController на стек. При ответвлении "шоу все транзакции" кнопка AccountController загружает список транзакций, помещает его в .transactions свойство его TransactionListController и продвигает TransactionListController на стек и так далее.

, Если, скажем, TransactionController редактирует транзакцию, он вносит изменение в своем объекте транзакции и затем называет его метод 'сохранения'. 'сохраните' отправляет TransactionChangedNotification. Любой другой контроллер, который должен обновить себя, когда изменения транзакции наблюдали бы уведомление и само обновление. TransactionListController, по-видимому, был бы; AccountController и AccountListController могли бы, в зависимости от того, что они пытались сделать.

Для № 1, в моих ранних приложениях у меня был своего рода displayModel:withNavigationController: метод в дочернем контроллере, который настроил бы вещи и продвинул бы контроллер на стек. Но поскольку я стал более довольным SDK, я дрейфовал далеко от этого, и теперь у меня обычно есть родительское нажатие ребенок.

Для № 3, рассмотрите этот пример. Здесь мы используем два контроллера, AmountEditor и TextEditor, для редактирования двух свойств Транзакции. Редакторы не должны на самом деле сохранять отредактированную транзакцию, так как пользователь мог решить отказаться от транзакции. Так вместо этого они оба берут свой родительский контроллер в качестве делегата и называют метод на нем говорящий, изменили ли они что-нибудь.

@class Editor;
@protocol EditorDelegate
// called when you're finished.  updated = YES for 'save' button, NO for 'cancel'
- (void)editor:(Editor*)editor finishedEditingModel:(id)model updated:(BOOL)updated;  
@end

// this is an abstract class
@interface Editor : UIViewController {
    id model;
    id <EditorDelegate> delegate;
}
@property (retain) Model * model;
@property (assign) id <EditorDelegate> delegate;

...define methods here...
@end

@interface AmountEditor : Editor
...define interface here...
@end

@interface TextEditor : Editor
...define interface here...
@end

// TransactionController shows the transaction's details in a table view
@interface TransactionController : UITableViewController <EditorDelegate> {
    AmountEditor * amountEditor;
    TextEditor * textEditor;
    Transaction * transaction;
}
...properties and methods here...
@end

И теперь несколько методов от TransactionController:

- (void)viewDidLoad {
    amountEditor.delegate = self;
    textEditor.delegate = self;
}

- (void)editAmount {
    amountEditor.model = self.transaction;
    [self.navigationController pushViewController:amountEditor animated:YES];
}

- (void)editNote {
    textEditor.model = self.transaction;
    [self.navigationController pushViewController:textEditor animated:YES];
}

- (void)editor:(Editor*)editor finishedEditingModel:(id)model updated:(BOOL)updated {
    if(updated) {
        [self.tableView reloadData];
    }

    [self.navigationController popViewControllerAnimated:YES];
}

вещь заметить состоит в том, что мы определили универсальный протокол, который Редакторы могут использовать для общения с их контроллером владения. Таким образом мы можем снова использовать Редакторов в другой части приложения. (Возможно, Учетные записи могут иметь примечания, также.), Конечно, протокол EditorDelegate мог содержать больше чем один метод; в этом случае это - единственное необходимое.

33
задан Brad Koch 15 March 2013 в 20:44
поделиться

2 ответа

Sure, use a Content-disposition header

header('Content-Disposition: attachment; filename="filetodownload.jpg"');

if you wish to provide a default filename, but not automatic download, this seems to work.

header('Content-Disposition: filename="filetodownload.jpg"');
58
ответ дан 27 November 2019 в 17:35
поделиться

Конечно, можете, просто попробуйте что-нибудь вроде этого:

$original_filename = '4324ffsd34.jpg';
$new_filename = 'my_new_filename_is_detailled.jpg';

// headers to send your file
header("Content-Type: application/jpeg");
header("Content-Length: " . filesize($original_filename));
header('Content-Disposition: attachment; filename="' . $new_filename . '"');

// upload the file to the user and quit
readfile($original_filename);
exit;

Надеюсь, это поможет!

25
ответ дан 27 November 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: